Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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 为什么ImageIO.write()方法修改像素值?_Java_Image_Bufferedimage_Javax.imageio - Fatal编程技术网

Java 为什么ImageIO.write()方法修改像素值?

Java 为什么ImageIO.write()方法修改像素值?,java,image,bufferedimage,javax.imageio,Java,Image,Bufferedimage,Javax.imageio,我正在尝试运行一个简单的Java程序,该程序尝试执行以下操作:从给定图像中提取像素数据。然后使用此数据创建相同类型的新图像。问题是,当我读取这个创建的图像的像素数据时,像素值与我写入的像素值不同。这种情况不仅发生在.jpg或.jpg图像上,也发生在某些.png图像上(因此它甚至不限于图像类型)。 这是我的密码: package com.alex; import java.awt.image.BufferedImage; import java.io.File; import java.io.I

我正在尝试运行一个简单的Java程序,该程序尝试执行以下操作:从给定图像中提取像素数据。然后使用此数据创建相同类型的新图像。问题是,当我读取这个创建的图像的像素数据时,像素值与我写入的像素值不同。这种情况不仅发生在.jpg或.jpg图像上,也发生在某些.png图像上(因此它甚至不限于图像类型)。 这是我的密码:

package com.alex;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class Test {

    public static void main(String[] args) {
        try{
            // Read source image
            BufferedImage img = ImageIO.read(new File("D:/field.png")); 


            int width = img.getWidth();
            int height = img.getHeight();
            int[] imagePixels = new int[width*height];
            img.getRGB(0, 0, width, height, imagePixels, 0, width);

            // Create copy image
            BufferedImage destImg = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());
            destImg.setRGB(0, 0, img.getWidth(), img.getHeight(), imagePixels, 0, img.getWidth());
            File out = new File("D:/test.png");
            ImageIO.write(destImg, "png", out);

            // Extract copy image pixels
            BufferedImage copy = ImageIO.read(new File("D:/test.png"));
            int width1 = copy.getWidth();
            int height1 = copy.getHeight();
            int[] extractedPixels = new int[width1*height1];
            copy.getRGB(0, 0, width1, height1, extractedPixels, 0, width1);

            System.out.println("The 2 dimensions are " + imagePixels.length + " " + extractedPixels.length );

            // Compare the piels from the 2 images
            int k=0;
            for(int i=0; i<imagePixels.length; i++) {
                if(imagePixels[i] != extractedPixels[i]) {
                    k++;
                }
            }
            System.out.println("Number of different pixels was: " + k);
            }catch(IOException e) {
            System.out.println("Exception was thrown during reading of image: " + e.getMessage());
            }

        }
}
package com.alex;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入javax.imageio.imageio;
公开课考试{
公共静态void main(字符串[]args){
试一试{
//读取源图像
buffereImage img=ImageIO.read(新文件(“D:/field.png”);
int width=img.getWidth();
int height=img.getHeight();
int[]图像像素=新的int[宽度*高度];
getRGB(0,0,宽度,高度,图像像素,0,宽度);
//创建复制图像
BuffereImage destImg=新的BuffereImage(img.getWidth(),img.getHeight(),img.getType());
destImg.setRGB(0,0,img.getWidth(),img.getHeight(),imagePixels,0,img.getWidth());
File out=新文件(“D:/test.png”);
ImageIO.write(destImg,“png”,out);
//提取复制图像像素
BuffereImage copy=ImageIO.read(新文件(“D:/test.png”);
int width1=copy.getWidth();
int height1=copy.getHeight();
int[]extractedPixels=新int[width1*height1];
getRGB(0,0,宽度1,高度1,提取像素,0,宽度1);
System.out.println(“2维为“+imagePixels.length+”+extractedPixels.length”);
//比较两张图片中的馅饼
int k=0;

对于(int i=0;i请确保您在读写时使用了正确的颜色模型

据报道,

返回默认RGB颜色模型中的整数像素数组(类型为\u INT \u ARGB)和来自部分图像数据的默认sRGB颜色空间。如果默认模型与图像颜色模型不匹配,则会进行颜色转换。使用此方法时,返回数据中每个颜色分量的精度只有8位。使用指定坐标(x,y)在图像中,可以通过以下方式访问ARGB像素:

[编辑]

您需要使用构造函数
buffereImage(宽度、高度、类型、颜色模型)
,如(
type\u BYTE\u BINARY
)所示:

当使用此类型作为BuffereImage构造函数的imageType参数时(该构造函数接受imageType参数,但没有ColorModel参数),将使用默认sRGB颜色空间中具有两种颜色的IndexColorModel创建一个1位图像:,{0,0,0}和{255,255,255}

每像素2或4位的图像可以通过BuffereImage构造函数构造,该构造函数通过提供具有适当贴图大小的ColorModel来获取ColorModel参数

(强调我的)

试试这个 首先在两个数组中打印相同的索引
如果结果不一致,则表示您在颜色模式下遇到问题,但如果结果相同,则表示您的比较不起作用。

这是怎么做的:
img.getRGB(0,0,宽度,高度,图像像素,0,宽度)
?@porfiriopartida,它用图像像素数据填充imagePixels数组使用图像,在该源代码的稍微修改版本中,显示输出。
二维为1024不同像素的数量为:0
明白了。有趣的是,如果使用创建的像素作为输入,它将执行精确的复制,它应该在内部为PNG进行压缩。img.getType()不是在第行中吗:BuffereImage Desting=new BuffereImage(img.getWidth(),img.getHeight(),img.getType());向我保证两个BuffereImage具有相同的颜色模型?或者是因为我需要从磁盘上的实际文件中复制颜色模型?如果是这样,可以这样做吗?您可以使用
getColorModel()验证它们的颜色模型是否相同
在从磁盘读取的图像和您创建的图像上。可能图像在视觉上是相同的,但在代码中的像素排列或颜色模型不同。不幸的是,所有3个BuffereImage的ColorModdel都是相同的。但感谢迄今为止的所有帮助。如果您设法找到了什么,请提供帮助。提示:尝试使用se要查看发生了什么(有时有效,有时完全失败)@AlexandruMarianObaj请将一些“失败”的图像附加或链接到您的问题,而不是我们的猜测。我使用带有附加图像的Scala REPL测试了我列出的解决方案。
pixel = rgbArray[offset + (y-startY)*scansize + (x-startX)];