Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以使用libjpeg读取带有alpha通道的JPEG吗?_Java_Jpeg_File Format_Libjpeg_Color Space - Fatal编程技术网

Java 我可以使用libjpeg读取带有alpha通道的JPEG吗?

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能够使用 包含

关于带有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用本机代码替换加载程序,从而改善这一点——目前这是一个性能瓶颈。)

这里有一些示例文件-向以下人员致歉:

在这里,您可以看到尝试使用各种Linux软件查看灰度+alpha和RGB+alpha图像的结果,我相信这些软件使用的是
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库可以用来处理它们
显然,对于更普遍的问题,至少还有两种其他解决方案:

  • 将软件更改为输出普通JPEG+表示alpha通道的PNG文件
  • 以某种方式提高Sun的ImageIO的性能
  • 。。。但是第一种方法会涉及大量的代码更改,而且不清楚如何进行后一种方法。在任何情况下,我认为如何使用
    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,或者是没有