У меня возникли проблемы с загрузкой изображения JPEG, снятого краем Samsung Galaxy S7 с javafx (изображение доступно на 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();
}
}
Вызов конструктора, который пытается загрузить изображение, печатает следующее сообщение об ошибке в потоке ошибок:
Feb 04, 2018 11:48:23 PM com.sun.javafx.tk.quantum.PrismImageLoader2 $ PrismLoadListener imageLoadWarning ПРЕДУПРЕЖДЕНИЕ: Недействительные параметры SOS для последовательного JPEG
Исключением, которое я получаю из объекта изображения, является сообщение IOException с сообщением:
Неподдерживаемый маркер типа 0x65
Я сделал некоторые исследования, и выясняется, что это известная проблема с панорамными изображениями, снятыми телефоном Samsung. Как указано в этом потоке: https://forums.adobe.com/thread/2131432, некоторые из байтов 0xFF, которые указывают, что следующий байт будет метаинформацией, а не фактическими данными, не сбрасываются путем добавления следующего 0x00 байт после 0xFF.
Однако я попытался написать код, который манипулирует данными изображения, чтобы добавить отсутствующие 0x00 байт, но это оказалось намного сложнее, чем ожидалось, и я не хочу писать свой собственный парсер/загрузчик JPEG.
Есть несколько программ, которые могут отображать эти недопустимые изображения JPEG, например, Microsoft Fotos или Paint. Похоже, они терпят эти недопустимые образы, рассматривая эти ложные маркеры как данные контента.
Есть ли способ загрузить эти недопустимые изображения с помощью java, не имея дело с одиночными байтами?