我怎样才能解决这个问题? JavaFX - 错误的JPEG库版本:库是80,调用者期望70

时间:2016-02-24 15:44:54

标签: javafx libjpeg

每当我尝试在JavaFX中创建一个Image时,都会收到此错误。绝对没有加载图像,但UI上的其他所有内容都是。我唯一一次看到这是<?php if($_product->getAttributeText('merchant_name')) { $name = $_product->getResource()->getAttribute('merchant_name')->getFrontend()->getValue($_product); } else { $name = "XXXXX"; } ?> <div class="Merchant_Name">By <?php echo $name ?>

StackOverflow上类似问题的其他答案建议重新安装libjpeg。但是,当我prism.verbose=true时,它会尝试删除看似非常重要的4 GB的软件包。

是否有其他人遇到过此问题并找到了一个可行的解决方案,并不是要求我重新安装整个操作系统?

这是整个堆栈跟踪:

sudo apt-get remove libjpeg8

这是我的java版本信息。我使用的是Oracle版本。

java.io.IOException: Wrong JPEG library version: library is 80, caller expects 70
at com.sun.javafx.iio.jpeg.JPEGImageLoader.initDecompressor(Native Method)
at com.sun.javafx.iio.jpeg.JPEGImageLoader.<init>(JPEGImageLoader.java:187)
at com.sun.javafx.iio.jpeg.JPEGImageLoaderFactory.createImageLoader(JPEGImageLoaderFactory.java:49)
at com.sun.javafx.iio.ImageStorage.getLoaderBySignature(ImageStorage.java:419)
at com.sun.javafx.iio.ImageStorage.loadAll(ImageStorage.java:266)
at com.sun.javafx.tk.quantum.PrismImageLoader2.loadAll(PrismImageLoader2.java:142)
at com.sun.javafx.tk.quantum.PrismImageLoader2.<init>(PrismImageLoader2.java:77)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.processStream(PrismImageLoader2.java:252)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.processStream(PrismImageLoader2.java:225)
at com.sun.javafx.runtime.async.AbstractRemoteResource.call(AbstractRemoteResource.java:109)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.access$201(PrismImageLoader2.java:225)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.lambda$call$428(PrismImageLoader2.java:259)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.call(PrismImageLoader2.java:258)
at com.sun.javafx.tk.quantum.PrismImageLoader2$AsyncImageLoader.call(PrismImageLoader2.java:225)
at com.sun.javafx.runtime.async.AbstractAsyncOperation.lambda$new$272(AbstractAsyncOperation.java:57)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

修改

我在我的应用上运行java version "1.8.0_72" Java(TM) SE Runtime Environment (build 1.8.0_72-b15) Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode) ,看起来有些东西只是专门搜索libjpeg 8。它根本不想尝试任何默认的libjpeg库或libjpeg 7。

2 个答案:

答案 0 :(得分:2)

一种可能的解决方法是不让 JPEGImageLoader 解码 jpeg,而是使用 ImageIO 进行解码。您失去了 javafx Image 的一些内置功能,这些功能只能通过构造函数参数使用,例如 smoothpreserveRatiobackgroundLoading,但至少它在 linux 上更安全。

这样的事情可能对你有用:

import java.awt.image.BufferedImage;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;

public static Image createImage(File file) throws IOException {
    BufferedImage bufferedImage = ImageIO.read(file);
    WritableImage writableImage = SwingFXUtils.toFXImage(bufferedImage, null);
    if (writableImage.isError()) {
        throw new RuntimeException(writableImage.getException());
    }
    return writableImage;
}

答案 1 :(得分:0)

我认为Java是与libjpeg7链接的,但你的LD_LIBRARY_PATH可能有libjpeg8,所以界面不匹配。

libjpeg.so附带Java(在x64系统的lib / amd64文件夹中),但这可能不是因为LD_LIBRARY_PATH中的覆盖而使用。