【问题标题】:How to set PIxelFormat to rgb in javafx?如何在 javafx 中将 PIxelFormat 设置为 rgb?
【发布时间】: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 通道。不知道我是否正确理解了你的问题。

标签: java image javafx


【解决方案1】:

您又是受到此错误https://bugs.openjdk.java.net/browse/JDK-8119048 打击的众多人之一,该错误被认为不够重要,无法修复。如果您阅读那里的 cmets,您会发现一个工作区。基本上这个想法是将转换后的图像复制成没有alpha通道的新图像。 我真的很想知道还有多少人要浪费他们的时间,直到这个错误最终得到足够的关注来修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2016-10-03
    • 1970-01-01
    相关资源
    最近更新 更多