Pixel transparency under the mouse - Java JFrame

I am new to java and decided to create a program that: sets a point in the window when you leave a click. And one more thing when you click again. And so on ... Then it connects all the dots with lines and shades on the side of the line, depending on how many points are on the side of the line. (For example, this) enter image description here

QUESTION STARTED HERE:

Now I need one more function. When I right-click, I want the transparency of the pixel in the mouse coordinates to appear. Therefore, when a click in the middle, it will show me that it is more transparent (or darker) than when I right-click on an area of ​​light.

I did some searches, but could not find the answer. The closest I got was to create a screenshot with the robot and use it as a bufferimage, and then analyze the pixels in this way. However, it seems I am not working, since wherever I click with the right mouse button, I get 255 255,255,255 for ARGB. And sometimes weird things like 255,234,236,245 for AGBA.

Hope you can keep track of what I'm trying to do.

Here is my code.

My main class, which runs the program, creates a window and has a mouse interface:

import javax.swing.*; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.event.*; import java.awt.image.BufferedImage; public class mouse { static DataTransfer data = new DataTransfer(); private static int x,y ; private static draw object = new draw(); public static int numPoints = 0; public static final int maxPoints = 4; public static void main(String[] args) throws Exception { JFrame frame = new JFrame(); Robot robot = new Robot(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("Drawing"); frame.setSize(500, 400 ); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.add(object); data.getRobot(robot,frame.getSize()); object.addMouseListener(new AL() ); } public static class AL extends MouseAdapter { public void mouseClicked( MouseEvent e){ if (e.getButton() == MouseEvent.BUTTON1) { if (numPoints < maxPoints){ x = e.getX(); y = e.getY(); object.drawing(x,y,numPoints); System.out.println("NUMBRER"+numPoints); numPoints++; } } if (e.getButton() == MouseEvent.BUTTON3) { x = e.getX(); y = e.getY(); int pixel = data.getScreen().getRGB(x, y); int alpha = (pixel >> 24) & 0xff; int red = (pixel >> 16) & 0xff; int green = (pixel >> 8) & 0xff; int blue = (pixel) & 0xff; System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue); } } } // Here I tried to access the Robot in the mouse class, but I couldn't so I had to create this transition class in hope of it working public static class DataTransfer{ BufferedImage screen ; public void getRobot(Robot robot,Dimension size) { screen = robot.createScreenCapture(new Rectangle( size )); } public BufferedImage getScreen(){ return screen; } } } 

And my Graphics class, which deals with hatching and line drawing, etc. (most of them are repeated for each case of shading, so you do not need to read all of this)

 import java.awt.Color; import java.awt.Graphics; import javax.swing.JPanel; @SuppressWarnings("serial") public class draw extends JPanel { int[] polX = new int[5]; int[] polY = new int[5]; int[] aX = new int[mouse.maxPoints]; int[] aY = new int[mouse.maxPoints]; float m, c; int corners; //float triAng = 30; float triAng = 255/(((mouse.maxPoints)*(mouse.maxPoints + 1))/2); public void drawing( int xx, int yy, int Number ) { aX[Number] = xx; aY[Number] = yy; repaint(); } public void paintComponent(Graphics g){ super.paintComponent(g); g.setColor(new Color(0,255,0,255)); g.setColor(new Color(255,0,0,(int)triAng )); for(int i=0; i<mouse.numPoints;i++){ for( int j = i+1; j < mouse.numPoints; j++) { // Shading the area //1) finding the equation of the line if( aX[i] != aX[j]){ if( aY[i] != aY[j]){ //Work out the Gradient m = (float)(aY[j] - aY[i] ) /(aX[j] - aX[i]); c = ((float)aY[i]-(((float)aX[i])*m)); for(int k=0;k<mouse.numPoints;k++){ if(m<0){ //Gradient is negative if(k!= i && k!=j){ //Below if( aX[k]*m+c < aY[k]){ //Clockwise from origin // Left Right // N - no additional corner // Y- Additional Corner // NN if( ( c >= 400) && (500*m+c) >= 0) { polX[1] = (int)((400-c)/m); polY[1] = 400; polX[2] = 500; polY[2] = (int)(500*m+c); corners = 3; } // NY else if( c >= 400 && (500*m+c) < 0) { polX[1] = (int)((400-c)/m); polY[1] = 400; polX[2] = (int)((0-c)/m); polY[2] = 0; polX[3] = 500; polY[3] = 0; corners = 4; } // YN else if( c < 400 && (500*m+c) >= 0) { polX[1] = 0; polY[1] = 400; polX[2] = 0; polY[2] = (int)c; polX[3] = 500; polY[3] = (int)(500*m+c); corners = 4; } // YY else if( c < 400 && (500*m+c) < 0){ polX[1] = 0; polY[1] = 400; polX[2] = 0; polY[2] = (int)c; polX[3] = (int)((0-c)/m); polY[3] = 0; polX[4] = 500; polY[4] = 0; corners = 5; } //Origin corners polX[0] = 500; polY[0] = 400; g.fillPolygon(polX, polY, corners); } //I am here ///////////////Above if( aX[k]*m+c > aY[k]){ //Clockwise from origin // Left Right // N - no additional corner // Y- Additional Corner // NN if( ( c <= 400) && (500*m+c) <= 0) { polX[1] = (int)((0-c)/m); polY[1] = 0; polX[2] = 0; polY[2] = (int)(c); corners = 3; } // NY else if( c <= 400 && (500*m+c) > 0) { polX[1] = 500; polY[1] = 0; polX[2] = 500; polY[2] = (int)(500*m+c); polX[3] = 0; polY[3] = (int)c; corners = 4; } // YN else if( c > 400 && (500*m+c) <= 0) { polX[1] = (int)((0-c)/m); polY[1] = 0; polX[2] = (int)((400-c)/m); polY[2] = 400; polX[3] = 0; polY[3] = 400; corners = 4; } // YY else if( c > 400 && (500*m+c) > 0){ polX[1] = 500; polY[1] = 0; polX[2] = 500; polY[2] = (int)(500*m+c); polX[3] = (int)((400-c)/m); polY[3] = 400; polX[4] = 0; polY[4] = 400; corners = 5; } //Origin corners polX[0] = 0; polY[0] = 0; g.fillPolygon(polX, polY, corners); } } } /////////////////////////////////////////////////////////////////////////////////////////////// if(m>0){ //Gradient is Positive if(k!= i && k!=j){ //Below if( aX[k]*m+c < aY[k]){ //Clockwise from origin // Left Right // N - no additional corner // Y- Additional Corner // NN if( ( c >= 0 ) && (500*m+c) >= 400) { polX[1] = 0; polY[1] = (int)c; polX[2] = (int)((400-c)/m); polY[2] = 400; corners = 3; } // NY else if( c >= 0 && (500*m+c) < 400) { polX[1] = 0; polY[1] = (int)c; polX[2] = 500; polY[2] = (int)(500*m+c); polX[3] = 500; polY[3] = 400; corners = 4; } // YN else if( c < 0 && (500*m+c) >= 400) { polX[1] = 0; polY[1] = 0; polX[2] = (int)((0-c)/m); polY[2] = 0; polX[3] = (int)((400-c)/m); polY[3] = 400; corners = 4; } // YY else if( c < 0 && (500*m+c) < 400){ polX[1] = 0; polY[1] = 0; polX[2] = (int)((0-c)/m); polY[2] = 0; polX[3] = 500; polY[3] = (int)(500*m+c); polX[4] = 500; polY[4] = 400; corners = 5; } //Origin corners polX[0] = 0; polY[0] = 400; g.fillPolygon(polX, polY, corners); } ///////////////Above if( aX[k]*m+c > aY[k]){ //Clockwise from origin // Left Right // N - no additional corner // Y- Additional Corner // NN if( ( c <= 0) && (500*m+c) <= 400) { polX[1] = 500; polY[1] = (int)(500*m+c); polX[2] = (int)((0-c)/m); polY[2] = 0; corners = 3; } // NY else if( c <= 0 && (500*m+c) > 400) { polX[1] = 500; polY[1] = 400; polX[2] = (int)((400-c)/m); polY[2] = 400; polX[3] = (int)((0-c)/m); polY[3] = 0; corners = 4; } // YN else if( c > 0 && (500*m+c) <= 400) { polX[1] = 500; polY[1] = (int)(500*m+c); polX[2] = 0; polY[2] = (int)c; polX[3] = 0; polY[3] = 0; corners = 4; } // YY else if( c > 0 && (500*m+c) > 40){ polX[1] = 500; polY[1] = 400; polX[2] = (int)((400-c)/m); polY[2] = 400; polX[3] = 0; polY[3] = (int)c; polX[4] = 0; polY[4] = 0; corners = 5; } //Origin corners polX[0] = 500; polY[0] = 0; g.fillPolygon(polX, polY, corners); } } } } } else{ //code for horizontal line } } else{ //Vertical } } } g.setColor(new Color(0,255,0,255)); for(int i=0; i<mouse.numPoints; i++){ g.fillOval(aX[i] - 10,aY[i]-10,20,20); } // Drawing The Line ////// for(int i=0; i<mouse.numPoints;i++){ for( int j = i+1; j < mouse.numPoints; j++){ g.setColor(new Color(0,255,0,255)); g.drawLine(aX[i], aY[i], aX[j], aY[j]); g.setColor(new Color(255,0,0,(int)triAng)); } } } } 
+6
source share
1 answer

It’s quite difficult to talk about the transparency of the pixel, because it doesn’t have one when it was drawn ...

transparency only works when drawing a pixel: you draw a specific color with a specific alpha on a specific background. result, the pixel itself no longer has alpha when it was drawn ...

what do you have:

  • you can easily get rgb values ​​from a pixel (you already have the code inside your code) ....
  • you can also get the painted color that you usually use (e.g. Color.RED) ....
  • you can also use background color (e.g. Color.WHITE) ....

what should you do

  • Using the above data, you must calculate the alpha value!

for example: a red pixel (source 0xFF0000) is 0x7F0000 against a white background (0xFFFFFF), it means that you have 0x7F transparency (50%)

but my knowledge is lacking here ... you will probably be able to compose your own calculations for transparency, I really hope ^^

+1
source

Source: https://habr.com/ru/post/982169/


All Articles