JavaFX 读取原始 RGB 图像

标签 java image javafx javafx-8

我在 JavaFX 中读取原始 RGB 图像时遇到问题。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelFormat;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class JavaFXRgb extends Application {
    @Override public void start(Stage stage) {
        FileInputStream fileInputStream = null;
        try {fileInputStream = new FileInputStream("0.rgb");}
        catch (FileNotFoundException exception) {exception.printStackTrace();}
        byte[] imageBytes = new byte[2_764_800]; //1280x720
        try {for (int bytesRead = 0; bytesRead < imageBytes.length; ) {bytesRead += fileInputStream.read(imageBytes, bytesRead, imageBytes.length - bytesRead);}}
        catch (IOException exception) {exception.printStackTrace();}
        WritableImage writableImage = new WritableImage(1280, 720);
        PixelWriter pixelWriter = writableImage.getPixelWriter();
        pixelWriter.setPixels(0, 0, 1280, 720, PixelFormat.getByteRgbInstance(), imageBytes, 0, 0);
        Group group = new Group(new ImageView(writableImage));
        Scene scene = new Scene(group);
        stage.setScene(scene);
        stage.sizeToScene();
        stage.show();
    }
}

压缩为 PNG 的原始图像(合理使用:最少使用:集中的一张图像): Original image

使用ImageMagick convert "0.png""0.rgb"获取我使用的文件。

JavaFX 中的图像: Image in JavaFX

加载的 JavaFX 图像似乎重复顶行。

我尝试摆弄行中的 PixelFormat:

pixelWriter.setPixels(0, 0, 1280, 720, PixelFormat.getByteRgbInstance(), imageBytes, 0, 0);

但没有成功的结果。不过我可以在 GIMP 中加载图像。

最佳答案

getByteRgbInstance()返回一种像素格式,其中每个像素有三个字节:红、绿、蓝各一个,按顺序排列。 setPixels 的最后一个参数方法是数组中从一行开头到下一行开头的偏移量之差。如果为此提供零,它只会重复读取每行的相同数据。

如果您使用图像宽度为 1280 的此格式,则 scanlineStride 应为 1280*3 = 3840。所以尝试一下:

pixelWriter.setPixels(0, 0, 1280, 720, 
    PixelFormat.getByteRgbInstance(), 
    imageBytes, 0, 1280*3);

如果失败,您可能需要检查 ImageMagick 文档以查看数据存储的实际格式。

关于JavaFX 读取原始 RGB 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35327445/

相关文章:

java - 如何在spark中读取HDFS序列文件

javascript - javascript点击不同图片时隐藏li的元素

javascript - 如何通过 Javascript 将图像添加到按钮?

JavaFX 重叠场景

java - 无法再使用 intellij 启动 javaFx 应用程序

java - 如何从 JavaFX 中的 Java Controller 控制 CSS 文件

java - GWT SinkEvent 在 Firefox 上除外

java - 在 bouncycaSTLe 中从私有(private)恢复 PGP 公钥

java - Eclipse模块问题jdk 10

css - 如何在不丢失透明度的情况下调整图标图像的大小?