JavaFX读取原始RGB图像

时间:2016-02-10 22:41:17

标签: 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中加载图像。

1 个答案:

答案 0 :(得分:2)

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

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

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

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