2015-02-08 62 views
6

我是新來的java,並決定做一個程序:當您離開單擊時在窗口中設置一個點。然後再點擊一次即可。等等......然後加入所有的點了線條和陰影線的側取決於有多少點上線的一側(像這樣)enter image description here在鼠標下的像素的透明度 - Java JFrame

問題從這裏開始:。

現在我需要一個更多的功能。當我右鍵單擊時,我想要顯示鼠標座標像素的透明度。所以當點擊中間時,它會告訴我,它比我右鍵點亮燈光區域時更透明(或更暗)。

我做了一些Google搜索,但找不到答案。最接近的我是創建一個與機器人截圖,並使用它作爲緩衝圖像,然後分析像素的方式。但是,我似乎沒有工作,因爲無論我右鍵單擊我得到255,255,255,255 ARGB。有時奇怪的東西像AGBA 255,234,236,245。

希望你可以按照我想要做的。

這是我的代碼。

我其中星級節目主類創建窗口,並執行鼠標接口:

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; 
    } 

} 
} 

而且我Graphics類與陰影和線條等交易...(大部分是重演了陰影的每一種情況下,這樣你就不需要閱讀整個事情)

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)); 

      } 
     } 
    } 
    } 

回答

1

這是相當難以啓齒像素的透明度,因爲它沒有一個一旦它被抽...

透明度僅適用於繪製像素時:您在特定背景上繪製某種特定顏色的特定字母。結果,像素本身不具有任何的α更一旦被抽...

你有什麼:

  • ,你可以很容易地從一個像素獲取的RGB值(你已經中有代碼你的代碼)....
  • 你也可以得到你通常使用的繪製顏色(如Color.RED)....
  • 你也可以得到背景顏色的使用(如Color.WHITE )....

你必須做的

  • 使用上面的數據你必須計算的alpha值!

例如:紅色像素(原爲0xFF0000)是0x7F0000白色(0XFFFFFF)背景意味着你必須0x7F的(50%)的透明度

但這裏沒有我的知識......你肯定可以彌補你自己的透明度計算,我真的希望如此^^