带有BufferedImage的setRGB提供了不正确的着色

时间:2016-02-07 09:23:08

标签: java opencv byte bytearray bufferedimage

我正在使用BufferedImages,特别是使用setRGB。我所做的是采用精确的RGBA字节值并在图像上重新应用它们以查看它们是否有效,并且图像以某种方式被肢解。我做错了什么?

BufferedImage subImg = inputImage.getSubimage(20,20,200,300);
byte[] pixels = ((DataBufferByte) subImg.getRaster().getDataBuffer()).getData();
int pixLength=0;
if(subImg.getAlphaRaster()!=null){
         for(int y=0; y<subImg.getHeight(); y++){
                    for(int x=0; x<subImg.getWidth(); x++){
                            inputImage.setRGB(20+x, 20+y,pixels[pixLength+3]<<24 + pixels[pixLength+2]<<16 + pixels[pixLength+1]<<8+pixels[pixLength]);
                            pixLength+=4;
                    }
         }
 }

根据这篇文章:Java - get pixel array from image

这似乎是正确的做法。但是,当我打印图像时,即使它不应该更改,该子部分现在看起来完全不同。任何帮助将不胜感激!我也使用带有rgba值的新Color尝试了setRGB,但这也没有用。做

inputImage.setRGB(20+x, 20+y,((int)pixels[pixLength+3]&0xff)<<24 + ((int)pixels[pixLength+2]&0xff)<<16 + ((int)pixels[pixLength+1]&0xff)<<8+((int)pixels[pixLength]&0xff)]);

也行不通。我很无能为力!

1 个答案:

答案 0 :(得分:0)

序列应为:

  1. alpha(pixLength
  2. blue(pixLength + 1
  3. 绿色(pixLength + 2
  4. 红色(pixLength + 3
  5. 另外,addition precedents shift;因此,您应该将setRGB更改为:

    inputImage.setRGB(20 + x, 20 + y, (((int)pixels[pixLength] & 0xff) << 24) + ((int)pixels[pixLength + 1] & 0xff) + (((int)pixels[pixLength + 2] & 0xff) << 8) + (((int)pixels[pixLength + 3] & 0xff) << 16)]);