使用ImageIO.write将其保存为PNG文件后,奇怪的颜色更改为BufferedImage

康斯坦丁诺斯(Konstantinos Kosyfarinis)

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

input.png和output.png的组合图像

这是当前在.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()是这些方面的。

凯文·蔡斯(Kevin J.Chase)

您正在尝试创建PNG文件,但此行...

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

...正在尝试编写JPEG。根据Unixfile命令,输出确实是JPEG ...,也带有暗青色像素的坏情况。

当我换"jpg""png",我得到了一个output.png看起来完全一样的文件input.png

我不知道您希望输出看起来像什么(并且我使用的是不同的输入文件),但这似乎比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---我的测试图像看起来都一样,但可能不是您想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 imageio 保存 3D 绘图

如何使用Java的ImageIO保存优化的png图像?

使用ImageIO发送图像后从ImageIO读取图像时未知字节

为什么使用ImageIO无法从URL获取BufferedImage

读取PNG使用ImageIO的输入零例外

无法使用ImageIO.read(文件文件)读取JPEG图像

Java 不创建图像文件(使用 ImageIO)

使用 Panda 数据框创建多个 .txt 文件并将其保存为 .csv 文件

使用ImageIO.write jpg文件时出现问题:粉红色背景

无法将绘图保存为 png 文件(使用 hgexport 时出错)

切割edf文件并使用Matlab将其保存为edf格式

使用ImageIo.read(InputStream)调整图像大小可返回Null BufferedImage

使用 Python3 和 imageio 错误地保存 .tif 图像

使用imageio时如何将图像作为rgb文件打开

使用imageio.readvol()从文件夹中读取所有图像(jpg)

提取2张图像之间变化的像素并使用图像魔术将其保存为新图像,同时保留原始颜色

gdal调整大小并使用python保存为png

使用 Octave 将绘图保存为 png

ImageIO.write()不保存文件

javax.imageio.ImageIO文件格式常量

使用matplotlib将图保存为pdf文件

使用golang将treenode保存为json文件?

使用 reportlab 生成的 pdf 文件,保存为纯文本

使用 EWS API 将 EmailBody 保存为 PDF 文件

使用 save-svg-as-png 将 SVG 保存为 PNG

使用 shell 脚本提取每一行并将其分配给变量并将其单独保存为新文件

Java ImageIO Grayscale PNG问题

ImageIO.write不能另存为gif,但适用于jpg和png?

ImageIO无法写入JPEG文件