2014-10-20 165 views
1

我試圖將Robot.createScreenCapture函數生成的RGB圖像轉換爲ARGB圖像。我的目標是在兩個圖像之間的像素沒有改變時設置透明度,但是我得到黑色。如下圖所示。如何將BufferedImage(RGB)轉換爲BufferedImage(ARGB或RGBA)?

例如BufferedImage,作爲創建如下:

BufferedImage currImage = robot.createScreenCapture(new Rectangle(x, y, width,height)); 

下面的函數意圖創造ARGB像素。

private BufferedImage bufferedImagesEqual(BufferedImage prevImage, 
     BufferedImage currImage) { 
    boolean changed = false; 
    BufferedImage imagePart = new BufferedImage(currImage.getWidth(), currImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 
    if (prevImage.getWidth() == currImage.getWidth() 
      && prevImage.getHeight() == currImage.getHeight()) { 

     for (int x = 0; x < currImage.getWidth(); x++) { 
      for (int y = 0; y < prevImage.getHeight(); y++) { 
       int argb = currImage.getRGB(x, y); 
       if (prevImage.getRGB(x, y) != currImage.getRGB(x, y)){ 
       // return false; 
        // currImage.setRGB(x, y, 0); 
        if(!changed){ 
         changed = true; 
        } 
       } 
       else { 
        imagePart.setRGB(x, y, 0xff000000); 
       } 
      } 
     } 
    } else { 
     return imagePart; 
    } 
    if(changed){ 
     return imagePart; 
    }else { 
     return null; 
    } 
} 
+0

前後setRGB調用後,這說明什麼回報? Color pixel = new Color(imagePart.getRGB(x,y),true); pixel.getAlpha() – Dylan 2014-10-20 02:22:36

+0

嘗試使用'new Color(0,0,0,0).getRGB()'而不是'0xff000000',因爲它消除了歧義 – MadProgrammer 2014-10-20 02:38:35

+0

0xff000000是不透明的黑色......你想要的是'0x0'(或者如果你想詳細說明,則爲'0x00000000'),這是100%透明的黑色(或者,而不是0不透明的黑色)。或者如@MadProgrammer所說,如果有疑問的話。 ;-) – haraldK 2014-10-20 10:41:24

回答

1

與之前和之後的圖像開始...

BeforeAfter

通過使用new Color(0, 0, 0, 0)代替0xff000000(和繪畫的東西時,像素作爲平等的),我得到

Output

正在使用...

import java.awt.AlphaComposite; 
import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 

public class ConvertBuffer { 

    public static void main(String[] args) { 
     try { 
      BufferedImage before = ImageIO.read(new File("/Before.jpg")); 
      BufferedImage after = ImageIO.read(new File("/After.jpg")); 

      BufferedImage result = bufferedImagesEqual(before, after); 

      JLabel label = new JLabel(new ImageIcon(result)); 
      label.setOpaque(true); 
      label.setBackground(Color.BLUE); 
      JOptionPane.showMessageDialog(null, label); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static BufferedImage bufferedImagesEqual(BufferedImage prevImage, 
        BufferedImage currImage) { 
     boolean changed = false; 
     BufferedImage imagePart = new BufferedImage(currImage.getWidth(), currImage.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     if (prevImage.getWidth() == currImage.getWidth() 
         && prevImage.getHeight() == currImage.getHeight()) { 

      for (int x = 0; x < currImage.getWidth(); x++) { 
       for (int y = 0; y < prevImage.getHeight(); y++) { 
        if (prevImage.getRGB(x, y) != currImage.getRGB(x, y)) { 
       // return false; 
         // currImage.setRGB(x, y, 0); 
         if (!changed) { 
          changed = true; 
         } 
         imagePart.setRGB(x, y, currImage.getRGB(x, y)); 
        } else { 
         imagePart.setRGB(x, y, new Color(0, 0, 0, 0).getRGB()); 
        } 
       } 
      } 
     } else { 
      return imagePart; 
     } 
     if (changed) { 
      return imagePart; 
     } else { 
      return null; 
     } 
    } 

} 

所以,除非你有一個例子形象一起玩,這是我們能做的最好的...

+0

它與原始的0xff000000有什麼不同? – Dylan 2014-10-20 02:54:35

+0

@Dylan它看起來黑色 – MadProgrammer 2014-10-20 02:56:01

+0

'新顏色(0,0,0,0)'消除了模糊性,沒有任何可能的方式來混淆該調用的意圖。 – MadProgrammer 2014-10-20 02:56:48