【发布时间】:2016-09-07 12:24:44
【问题描述】:
使用 javafx,当我读取图像时,PixelFormat 是 rgb,我想对它们应用过滤器。我使用 writableImage.pixelWriter 设置像素颜色,但 PixelFormat 是 rgba。
我使用 ImageIO.write(),它适用于 .png,但是当我尝试将修改后的图像保存为 .jpg 或 .jpeg 时,颜色会发生变化。我发现这是因为 rgba 不适用于 jpg,但我不知道如何更改此 PixelFormat。
有没有办法改变 rgb 中的 rgba 格式?你知道另一种将 javafx Image 保存为 .jpg/.jpeg 的方法吗?
编辑:我如何保存文件(适用于 png)
fileChooser.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("JPG Files", "*.jpg"));
File outputFile = fileChooser.showSaveDialog(null);
BufferedImage bImage = SwingFXUtils.fromFXImage(modifiedImage.getImage(), null); // getImage() return a javafx.scene.image.Image;
try {
ImageIO.write(bImage, "jpg", outputFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
我如何修改图像(示例)
Image currentImage = modifiedImage.getImage();
WritableImage writableImage = new WritableImage((int) currentImage.getWidth(), (int) currentImage.getHeight());
PixelReader pixelReader = currentImage.getPixelReader();
PixelWriter pixelWriter = writableImage.getPixelWriter();
for (int i = 0; i < (int) currentImage.getWidth(); i++) {
for (int j = 0; j < (int) currentImage.getHeight(); j++) {
pixelWriter.setColor(i, j, new Color(0,0,0,1));
}
}
modifiedImage.setImage(writableImage);
当我得到阅读器的 PixelFormat 时,它是 rgb,但对于作家来说,它是 rgba。如果我不修改就保存图像,那很好,但是当我对其应用过滤器并将图像保存为 jpg 时,颜色会发生变化。
在我的应用程序上,颜色很好,但如果我在外面打开 jpg 文件,它们就不行了。使用 png 文件没有问题。我可以只允许保存为 png,但如果我可以选择会更好。
解决方案:
BufferedImage bImage = SwingFXUtils.fromFXImage(modifiedImage.getImage(), null);
BufferedImage bImage2 = new BufferedImage(bImage.getWidth(), bImage.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
bImage2.getGraphics().drawImage(bImage, 0, 0, null);
try {
ImageIO.write(bImage2, "jpg", outputFile);
} catch (IOException e) {
throw new RuntimeException(e);
}
【问题讨论】:
-
您能否提供一些代码如何使用 ImageIO 来写入像素?基本上 rgba 'a' 中的 'a' 是 alpha 通道。如果您想要 rgb,则只需使用“r”、“g”和“b”通道并跳过 alpha 通道。不知道我是否正确理解了你的问题。