我在 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/