【问题标题】:JavaFX reading raw RGB imageJavaFX读取原始RGB图像
【发布时间】:2016-05-21 12:39:37
【问题描述】:

我无法在 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

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

JavaFX 中的图像: Image in JavaFX

加载的 JavaFX 图像似乎重复了第一行。

我尝试在行中摆弄PixelFormat

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

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

【问题讨论】:

    标签: java image javafx javafx-8


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您澄清 scanlineStride。我略读了一下,我认为它与 BMP 行填充有关。
    猜你喜欢
    • 2018-03-17
    • 2022-11-19
    • 2017-01-30
    • 2012-09-29
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-13
    相关资源
    最近更新 更多