我正在使用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值的新颜色的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)]);

也行不通。我很笨!

最佳答案

顺序应为:

  • alpha(pixLength)
  • 蓝色(pixLength + 1)
  • 绿色(pixLength + 2)
  • 红色(pixLength + 3)

  • 另外,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)]);
    

    10-07 19:06
    查看更多