Java 我可以使用libjpeg读取带有alpha通道的JPEG吗?
关于带有alpha通道的JPEG是否有效,似乎存在一些争论。我一直认为正确的答案是,基本上是“不”。(这一点在中得到了重申。) 然而,Sun的ImageIO库中的Java的JPEGImageWriter将很高兴地使用alpha通道写入和读取灰度和RGB图像,尽管到目前为止,我在Linux上几乎没有尝试过能够正确加载此类JPEG的应用程序。过去有报道称这是一个bug,但Sun的回应是: 这不是映像I/O错误,而是其他应用程序中的缺陷 提交人提到。IIO JPEGImageWriter能够使用 包含alpha通道的颜色模型(在IJG本机中引用) 源代码称为“漂亮的”颜色空间,如RGBA、YCbCrA等),但许多应用程序并不知道这些颜色空间。所以即使这些图像 由IIO JPEG编写器编写,符合JPEG规范(其中 对各种颜色空间的可能性视而不见),某些应用程序可能不会 识别包含alpha通道的颜色空间,并可能引发 错误或呈现损坏的图像,如提交者所述 希望与这些其他alpha应用程序保持兼容性的开发人员 应用程序应该写入不包含alpha通道的图像(例如 输入_INT _RGB)。希望具有写入/读取图像能力的开发人员 包含JPEG格式的alpha通道可以使用图像I/O来实现 API,但需要注意的是,许多本机应用程序并不完全相同 符合YCbCrA和RGBA格式 有关详细信息,请参阅图像I/O JPEG元数据格式规范和使用说明: 以“不是bug”结束。 xxxxx@xxxxx2003-03-24 我正在使用一个Java应用程序来创建这样的文件,并希望编写一些C代码来尽快加载这些文件。(本质上,问题在于Java ImageIO库在解压这些文件时速度非常慢,我们希望通过JNI用本机代码替换加载程序,从而改善这一点——目前这是一个性能瓶颈。) 这里有一些示例文件-向以下人员致歉:Java 我可以使用libjpeg读取带有alpha通道的JPEG吗?,java,jpeg,file-format,libjpeg,color-space,Java,Jpeg,File Format,Libjpeg,Color Space,关于带有alpha通道的JPEG是否有效,似乎存在一些争论。我一直认为正确的答案是,基本上是“不”。(这一点在中得到了重申。) 然而,Sun的ImageIO库中的Java的JPEGImageWriter将很高兴地使用alpha通道写入和读取灰度和RGB图像,尽管到目前为止,我在Linux上几乎没有尝试过能够正确加载此类JPEG的应用程序。过去有报道称这是一个bug,但Sun的回应是: 这不是映像I/O错误,而是其他应用程序中的缺陷 提交人提到。IIO JPEGImageWriter能够使用 包含
libjpeg
:
(来源:) 因此,在每种情况下,颜色空间似乎都被误解了。
jpeglib.h
中唯一允许的值是:
/* Known color spaces. */
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
JCS_RGB, /* red/green/blue */
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
JCS_CMYK, /* C/M/Y/K */
JCS_YCCK /* Y/Cb/Cr/K */
} J_COLOR_SPACE;
。。。这看起来不太可能
如果我从libjpeg
加载这些图像时使用稍微修改过的example.c
,则读取标题后每个图像的cinfo.jpeg\u color\u space
和cinfo.out\u color\u space
的值如下:
gray-normal.jpg: jpeg_color_space is JCS_GRAYSCALE, out_color_space is JCS_GRAYSCALE
gray-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
rgb-normal.jpg: jpeg_color_space is JCS_YCbCr, out_color_space is JCS_RGB
rgb-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
因此,我的问题是:
- 能否使用libjpeg正确读取这些文件
- 如果没有,是否有一个可供选择的C库可以用来处理它们
libjpeg
加载这样的文件可能是一个更普遍的问题
如果您有任何建议,我们将不胜感激。您已经试过了吗?它应该能够解码RGBA,并且已经有了一个Java包装器。我已经尝试在带有alpha通道的彩色图像上运行libjpeg-turbo,这些图像已与Java的ImageIO一起保存为jpeg 以下是我为linux 64位编译libjpeg-turbo的方法:
$ autoreconf -fiv
$ mkdir build
$ cd build
$ sh ../configure --with-java CPPFLAGS="-I$JAVA_HOME/include -I$JAVA_HOME/include/linux"
$ make
$ cd ..
$ mkdir my-install
$ cd build
$ make install prefix=$PWD/../my-install libdir=$PWD/../my-install/lib64
这就是我如何使用正确的库路径和类路径运行斐济,包括libjpeg-turbo:
$ cd Programming/fiji
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/../java/libjpeg-turbo/libjpeg-turbo/my-install/lib64
$ ./fiji -cp $PWD/../java/libjpeg-turbo/libjpeg-turbo/my-install/classes/turbojpeg.jar
这是一个用于读取此类jpeg+alpha文件的小jython脚本:
######
path = "/home/albert/Desktop/t2/trakem2.1263462814399.1347985440.1111111/trakem2.mipmaps/0/17.07may04b_GridID02043_Insertion001_00013gr_00005sq_00014ex.tif.jpg"
from org.libjpegturbo.turbojpeg import TJDecompressor, TJ
from java.io import File, FileInputStream
from java.awt.image import BufferedImage
from jarray import zeros
f = File(path)
fis = FileInputStream(f)
b = zeros(fis.available(), 'b')
print len(b)
fis.read(b)
fis.close()
d = TJDecompressor(b)
print d.getWidth(), d.getHeight()
bi = d.decompress(d.getWidth(), d.getHeight(), BufferedImage.TYPE_INT_ARGB, 0)
ImagePlus("that", ColorProcessor(bi)).show()
####
######
path=“/home/albert/Desktop/t2/trakem2.1263462814399.1347985440.1111111/trakem2.mipmaps/0/17.07may04b\u grid02043\u Insertion001\u 00013gr\u 00005sq\u 00014ex.tif.jpg”
从org.libjpegturbo.turbojpeg导入TJDecompressor,TJ
从java.io导入文件,FileInputStream
从java.awt.image导入BuffereImage
从jarray导入零
f=文件(路径)
fis=文件输入流(f)
b=零(fis.available(),'b')
打印透镜(b)
财政司司长(b)
财政司司长(财政司司长)
d=TJDecompressor(b)
打印d.getWidth(),d.getHeight()
bi=d.decompress(d.getWidth(),d.getHeight(),buffereImage.TYPE\u INT\u ARGB,0)
ImagePlus(“that”,ColorProcessor(bi)).show()
####
问题是:无论我在TJ类中使用什么标志(解压调用中的“0”)(请参见),我都无法加载jpeg
以下是错误消息:
Started turbojpeg.py at Thu Jun 02 12:36:58 EDT 2011
Traceback (most recent call last):
File "", line 15, in
at org.libjpegturbo.turbojpeg.TJDecompressor.decompressHeader(Native Method)
at org.libjpegturbo.turbojpeg.TJDecompressor.setJPEGImage(TJDecompressor.java:89)
at org.libjpegturbo.turbojpeg.TJDecompressor.(TJDecompressor.java:58)
at sun.reflect.GeneratedConstructorAccessor10.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.python.core.PyReflectedConstructor.constructProxy(PyReflectedConstructor.java:210)
java.lang.Exception: java.lang.Exception: tjDecompressHeader2(): Could not determine subsampling type for JPEG image
于2011年6月2日星期四12:36:58 EDT启动turbojpeg.py
回溯(最近一次呼叫最后一次):
文件“”,第15行,在
位于org.libjpegturbo.turbojpeg.TJDecompressor.decompressHeader(本机方法)
位于org.libjpegturbo.turbojpeg.TJDecompressor.setJPEGImage(TJDecompressor.java:89)
位于org.libjpegturbo.turbojpeg.TJDecompressor.(TJDecompressor.java:58)
位于sun.reflect.GeneratedConstructorAccessor10.newInstance(未知源)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:513)
位于org.python.core.PyReflectedConstructor.constructProxy(PyReflectedConstructor.java:210)
java.lang.Exception:java.lang.Exception:tjDecompressHeader2():无法确定JPEG图像的子采样类型
因此,可能是libjpeg-turbo无法读取ImageIO保存的带有alpha的jpeg,或者是没有