【发布时间】:2018-02-15 05:24:00
【问题描述】:
我无法使用 javafx 加载由三星 Galaxy S7 edge 拍摄的 JPEG 图像(图像可在https://www.dropbox.com/s/w6lvdnqwcgw321s/20171122_140732.jpg?dl=0 获得)。我正在使用 Image 类来加载图像。
import java.io.FileInputStream;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class JPEGProblem extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage window) throws Exception {
Image img = new Image(new FileInputStream("/path/to/image.jpg"));
if (img.getException() != null)
throw img.getException();
ImageView imgView = new ImageView(img);
window.setScene(new Scene(new Pane(imgView)));
window.show();
}
}
尝试加载图像的构造函数调用在错误流上打印以下错误消息:
2018 年 2 月 4 日晚上 11:48:23 com.sun.javafx.tk.quantum.PrismImageLoader2$PrismLoadListener imageLoadWarning 警告:顺序 JPEG 的 SOS 参数无效
我从图像对象获得的异常是带有以下消息的 IOException:
不支持的标记类型 0x65
我进行了一些研究,结果发现这是三星手机拍摄的全景图像的一个已知问题。正如该线程中所指出的那样:https://forums.adobe.com/thread/2131432,一些 0xFF 字节表示后面的字节是元信息而不是实际数据,不会通过在 0xFF 之后添加后面的 0x00 字节来转义。
但是,我尝试编写操作图像数据的代码以添加丢失的 0x00 字节,但结果比预期的要复杂得多,而且我不想编写自己的 JPEG 解析器/加载器。
有一些程序可以显示那些无效的 JPEG 图像,例如微软照片或画图。他们似乎容忍这些无效图像,将那些虚假标记视为内容数据。
有没有办法用java加载这些无效的图像,而不用自己处理单个字节?
【问题讨论】: