【问题标题】:Strange color changes to a BufferedImage after saving it as a PNG file with ImageIO.write使用 ImageIO.write 将其保存为 PNG 文件后,BufferedImage 出现奇怪的颜色变化
【发布时间】:2017-12-20 02:23:07
【问题描述】:

我一直在尝试制作一个 Java 程序,它允许将 BufferedImage 中的某些像素颜色更改为其他颜色,但正在绘制的颜色似乎覆盖了旧的颜色。这就是我的意思:

这是目前 .java 文件中的代码:

static BufferedImage image = null;
static File file = null;
static int height;
static int width;
static int[][][] pixelStorage;
static int pixel;
static int getPixelDataOutput = 0;
static Random random = new Random();

public static void main(String args[]) throws IOException {

    System.out.println("test");

    try {
        file = new File("C:\\Users\\kkosy\\Dev\\Java\\Random\\Images - Color Changer\\Images\\input.png");
    }catch(Exception exception) {
        System.out.println(exception);
    }

    image = ImageIO.read(file);

    height = image.getHeight();
    width = image.getWidth();

    pixelStorage = new int[height][width][4];

    for(int h = 0; h < height - 1; h++) {
        for(int w = 0; w < width - 1; w++) {
            savePixelData(w, h);
            if(getPixelData(w,h,"r") == 0){
                System.out.println();
                printPixelData(w,h,"Before -- ");
                setPixelData(w,h,255,0,0,255);
                printPixelData(w,h,"After -- ");
            }
        }
    }

    try {
        file = new File("C:\\Users\\kkosy\\Dev\\Java\\Random\\Images - Color Changer\\Images\\output.png");
        ImageIO.write(image, "jpg", file);
    }catch(Exception exception){
        System.out.println(exception);
    }

}

private static void savePixelData(int x, int y) {
    pixel = image.getRGB(x,y);
    pixelStorage[y][x][0] = (pixel >> 24) & 0xff;
    pixelStorage[y][x][1] = (pixel >> 16) & 0xff;
    pixelStorage[y][x][2] = (pixel >> 8) & 0xff;
    pixelStorage[y][x][3] = pixel & 0xff;
    //printPixelData(x,y,"");

}

private static void setPixelData(int x, int y, int alpha, int red, int green, int blue) {
    int setPixel = (alpha << 24) | (red << 16) | (green << 8) | (blue);
    image.setRGB(x, y, setPixel);
    image.setRGB(x, y, new Color(red,green,blue).getRGB());
}

private static void printPixelData(int x, int y, String arguments) {
    System.out.println(arguments + "" + pixelStorage[y][x][0] + " " + pixelStorage[y][x][1] + " " + pixelStorage[y][x][2] + " " + pixelStorage[y][x][3] + " ");
}

private static int getPixelData(int x, int y, String argb) {
    switch(argb) {
    case "a": {
        getPixelDataOutput = pixelStorage[y][x][0];
        break;
    }
    case "r": {
        getPixelDataOutput = pixelStorage[y][x][1];
        break;
    }
    case "g": {
        getPixelDataOutput = pixelStorage[y][x][2];
        break;
    }
    case "b": {
        getPixelDataOutput = pixelStorage[y][x][3];
        break;
    }
    }
    return getPixelDataOutput;
}

我不知道为什么它会输出这样的图像。也许是setRGB() 或类似的东西。

【问题讨论】:

    标签: java image colors png


    【解决方案1】:

    您正在尝试创建一个 PNG 文件,但是这一行...

    ImageIO.write(image, "jpg", file);
    

    ...正在尝试编写 JPEG。 根据Unixfile命令,输出确实是JPEG... 深青色像素也很糟糕。

    当我将"jpg" 更改为"png" 时,我得到了一个看起来与input.png 完全相同的output.png 文件。

    我不知道你想要输出的样子 (我正在使用 different input file) 但这似乎比颜色错误的 JPEG-in-PNG 服装更接近。


    您的日志将无法用于调试,因为printPixelData 总是打印pixelStorage 中的值。 由于setPixelData 仅更改image 中的值,因此您将始终打印两次“之前”值,而不是“之后”值。

    顺便说一句,所有这些静态变量使得跟踪程序的执行比原来要困难得多。 至少把你能做的转移到方法中 (如heightwidthfile,它们从未在main 之外使用), 并删除你根本不使用的那些 (如getPixelDataOutputrandom)。


    可能不相关,但setPixelData 方法设置一个像素,然后立即将其重置为其他值:

    private static void setPixelData(
      int x, int y,
      int alpha, int red, int green, int blue
    ) {
        int setPixel = (alpha << 24) | (red << 16) | (green << 8) | (blue);
        image.setRGB(x, y, setPixel);
        // Why overwrite the value you just set?
        image.setRGB(x, y, new Color(red,green,blue).getRGB());
    }
    

    这似乎并没有改变任何东西 --- (无论是否第一次调用setRGB,我的测试图像看起来都一样—— 但这可能不是您想要的。

    【讨论】:

    • 我在 setPixelData 方法中有第二个 setRGB,这样我就可以测试一些东西,看看颜色是否要修复,但感谢您注意到 JPG 和 PNG 错误,ImageIO.write (图像,“jpg”,文件);我已经解决了这个错误,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2010-10-14
    • 1970-01-01
    • 2010-09-17
    • 2021-11-16
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多