我怎样才能解决这个问题?JavaFX-错误的JPEG库版本:库为80,调用方预期为70
每当我试图在JavaFX中创建一个图像时,就会出现这个错误。绝对没有图像正在加载,但UI上的所有其他内容都在加载。我唯一一次看到这种情况是在我怎样才能解决这个问题?JavaFX-错误的JPEG库版本:库为80,调用方预期为70,javafx,libjpeg,Javafx,Libjpeg,每当我试图在JavaFX中创建一个图像时,就会出现这个错误。绝对没有图像正在加载,但UI上的所有其他内容都在加载。我唯一一次看到这种情况是在prism.verbose=true StackOverflow上类似问题的其他答案建议重新安装libjpeg。但是当我执行sudo apt获取remove libjpeg8时,它会尝试删除价值4 GB的包,这些包看起来非常重要 有没有其他人经历过这种情况并找到了一个可行的解决方案,而不需要我重新安装整个操作系统 以下是整个stacktrace: java.
prism.verbose=true
StackOverflow上类似问题的其他答案建议重新安装libjpeg。但是当我执行sudo apt获取remove libjpeg8
时,它会尝试删除价值4 GB的包,这些包看起来非常重要
有没有其他人经历过这种情况并找到了一个可行的解决方案,而不需要我重新安装整个操作系统
以下是整个stacktrace:
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)
编辑:
我在我的应用程序上运行了
strace
,似乎有什么东西专门搜索libjpeg 8。它从未尝试寻找任何默认的libjpeg库或libjpeg 7。我认为Java与libjpeg 7相链接,但您的LD_library_路径中可能有libjpeg 8,因此接口不匹配
libjpeg.so
随Java一起提供(在x64系统的lib/amd64文件夹中),但可能由于LD_LIBRARY_路径中存在重写,因此未使用此功能。一个可能的解决方法是不让JPEGImageLoader
解码JPEG,而是使用ImageIO
来执行此操作。您失去了javafx映像的一些内置功能,这些功能只能通过构造函数参数使用,例如smooth
,preserveRatio
,backgroundload
,但至少在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;
}
看起来你在运行Debian衍生工具。您使用的是OpenJDK还是Oracle的JDK?如果您使用的是OpenJDK,您可能希望尝试切换:sudo sudo add apt repository ppa:webupd8team/java&&sudo apt get update&&sudo apt get install oracle-java8-installer&&sudo apt get install oracle-java8-set-default我正在使用oracle的JDK。我还用我的版本信息更新了我的问题。你能试着安装libjpeg7,看看这是否解决了问题吗?我的包管理器的repos中没有看到libjpeg7。只有libjpeg62和libjpeg8。我在采用OpenJDK 11.0.10、turbojpeg(80)的Arch上具有相同的行为<代码>错误的JPEG库版本:库是80,调用方期望90我的
LD_库路径中唯一的东西是我的IDE中的/usr/local/IntelliJ-15.0.3/bin
。它只包含几个.so文件。两者都不是libjpeg。但是我确实在我的jre的bin中看到了libjpeg.so文件。那么你是从IntelliJ和捆绑的jre运行这个文件的?使用系统安装的Oracle JRE运行时有什么不同吗?我选择使用系统的JRE来运行项目。我还尝试在IDE之外使用终端上的Gradle运行项目,同样的事情也发生了。不过我上班的时候会再检查一遍。
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;
}