Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 试图从PNG图像中提取字节_Java_Image_Png_Bytearray_Bufferedimage - Fatal编程技术网

Java 试图从PNG图像中提取字节

Java 试图从PNG图像中提取字节,java,image,png,bytearray,bufferedimage,Java,Image,Png,Bytearray,Bufferedimage,我试图从PNG中提取字节,得到一些奇怪的结果 以下是我的提取字节方法: public static byte[] extractBytes (String ImageName) throws IOException { // open image File imgPath = new File(ImageName); BufferedImage bufferedImage = ImageIO.read(imgPath); // get DataBuffe

我试图从PNG中提取字节,得到一些奇怪的结果

以下是我的提取字节方法:

public static byte[] extractBytes (String ImageName) throws IOException {
     // open image
     File imgPath = new File(ImageName);
     BufferedImage bufferedImage = ImageIO.read(imgPath);

     // get DataBufferBytes from Raster
     WritableRaster raster = bufferedImage.getRaster();
     DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();

     return ( data.getData() );
}
这里是我调用函数并通过结果字节[]循环的地方:

byte[] bytes = extractBytes("colorstrip.png");

for (int x : bytes) {
    System.out.println(x);
}
我已经在一个4x1图像上测试了这段代码,该图像仅包含一个红色像素、一个蓝色像素、一个绿色像素和一个紫色像素。以下是输出:

-1
0
0
-1
-1
0
-1
0
-1
-1
0
0
-1
-1
0
-1
我觉得这个输出不正确。我认为输出应该是这样的(我将alpha通道留空):


知道问题出在哪里吗?

Java字节是有符号的,所以当您希望0-255范围内有255个字节时,Java使用的是-128到127范围,因此将无符号的255打印为有符号的-1。

Java字节是有符号的,所以当您希望0-255范围内有255个字节时,java使用的是-128到127范围,因此将无符号255打印为有符号-1。

缓冲区图像的类型是什么?我怀疑是4BYTE型ABGR。 由于值为255的字节在Java中会变成-1,因此输出似乎是正确的。
-1,0,0,-1=alpha:255,蓝色:0,绿色:0,红色255。

缓冲区图像的类型是什么?我怀疑是4BYTE型ABGR。 由于值为255的字节在Java中会变成-1,因此输出似乎是正确的。 -1,0,0,-1=alpha:255,蓝色:0,绿色:0,红色255。

+1对于记住(除了有符号的Java字节)BuffereImage支持严重的内部表示,不应假设+1对于记住(除了有符号的Java字节)BuffereImage支持严重的内部表示,我们不应该这样认为。
255
0
0

0
255
0

0
0
255

255
0
255