Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transparency of Pixel under mouse - Java JFrame

Tags:

java

I'm new to java and decided to make a program that : sets a point in the window when you left click. And then another point when you click again. And so on... Then it joins all the points up with lines and shades a side of the line depending on how many points are on a side of a line.( like this ) enter image description here

QUESTION STARTS HERE:

Now I need one more feature. When I right click , I want the transparency of the pixel at the mouse co-ordinates to appear. So when clicked in the middle it will show me that it's more transparent( or darker ) than when I right click the light areas.

I did some googling but couldn't find the answer.The closest I got to was create a screenshot with robot and use that as a bufferimage and then analyse the pixels that way. However I does not seem to work since wherever I right click I get 255,255,255,255 for ARGB. And sometimes weird stuff like 255,234,236,245 for AGBA.

Hope you can follow what I'm trying to do.

Here's my code.

My Main class which stars the program creates the window and does the 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 the shading and line drawing etc... ( most of it repeats itself for each case of the shading , so you don't need to read the whole thing )

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

                                        //  N N
                                        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;

                                        }

                                        //  N Y
                                        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;
                                        }
                                        //  Y N
                                        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

                                        //  N N
                                        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;

                                        }

                                        //  N Y
                                        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;
                                        }
                                        //  Y N
                                        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;
                                        }
                                        //  Y Y
                                        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

                                        //  N N
                                        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;

                                        }

                                        //  N Y
                                        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;
                                        }
                                        //  Y N
                                        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;
                                        }
                                        //  Y Y
                                        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

                                        //  N N
                                        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;

                                        }

                                        //  N Y
                                        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;
                                        }
                                        //  Y N
                                        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;
                                        }
                                        //  Y Y
                                        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));

            }
        }   
    }
    }
like image 617
kacper kazaniecki Avatar asked Feb 08 '15 13:02

kacper kazaniecki


1 Answers

it's pretty hard to tell the transparency of a pixel, because it doesn't have one once it's been drawn...

transparency only works, when you draw a pixel: you draw a certain color with a certain alpha on a certain background. the result, the pixel itself has no alpha any more once it has been drawn...

what you have:

  • you can easily get the rgb values from a pixel (you already have that code within your code)....
  • you can also get the draw-color you typically use (like Color.RED)....
  • you can also get the back-ground-color use (like Color.WHITE)....

what you have to do

  • using the data above you have to calculate the alpha value!

for example: a red pixel (original 0xFF0000) is 0x7F0000 on a white (0xFFFFFF) background means you have a transparency of 0x7F (50%)

but here lacks my knowledge... you surely can make up your own calculations for transparency, i really hope so ^^

like image 108
Martin Frank Avatar answered Oct 26 '22 22:10

Martin Frank