2011-06-02 42 views
10

似乎有一些關於alpha通道的JPEG是否有效的爭論。我一直認爲正確的答案是that in the JPEG FAQ,它本質上是「否」。 (這是在another question on Stack Overflow重申。)我可以使用libjpeg來讀取帶有alpha通道的JPEG嗎?

然而,Java的JPEGImageWriter Sun公司的ImageIO庫會很樂意寫,alpha通道讀取的灰度和RGB圖像,即使有在Linux上幾乎沒有任何應用程序,到目前爲止,我已經試過將正確加載這些JPEG。這已經報道,在過去的錯誤,但Sun的迴應是,these are valid files

這不是一個圖像I/O錯誤,而是在提交提到的其它應用 缺乏。 IIO JPEGImageWriter能夠用 寫一個包含alpha通道的顏色模型(在IJG原生 源代碼中稱爲「NIFTY」顏色空間,如RGBA,YCbCrA等),但許多應用程序都是不知道這些色彩空間。因此,即使這些由IIO JPEG寫入器編寫的圖像 符合JPEG規範(其中 對各種色彩空間可能性都是盲目的),但某些應用程序可能不識別包含alpha通道的色彩空間,並且可能會拋出 錯誤或呈現損壞的圖像,如提交者描述的那樣。

開發人員希望保持與這些其他不知道alpha- 應用程序的兼容性應寫入不包含alpha通道的圖像(如 TYPE_INT_RGB)。開發人員想要以JPEG格式編寫/讀取包含alpha通道的圖像 ,可以使用圖像I/O API執行此操作,但需要注意的是,許多本機應用程序並不完全符合 YCbCrA和RGBA格式。

有關詳細信息,請參閱圖像I/O JPEG元數據格式規範和使用注意事項: http://java.sun.com/j2se/1.4.1/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html

截止爲「不是一個錯誤」。 XXXXX @ XXXXX 2003-03-24

我與像創建這些文件的Java應用程序的工作,並希望寫一些C代碼,將盡可能快地加載這些。 (本質上問題是Java ImageIO庫在解壓縮這些文件時速度非常慢,我們希望通過JNI替代裝載程序,並使用本地代碼通過JNI進行改進 - 這是目前性能瓶頸。)

有一些示例文件在這裏 - 道歉的人誰是coulrophobic

在這裏你可以看到試圖查看灰階+α和使用Linux軟件的各種位RGB +阿爾法圖像的結果我相信使用libjpeg

grayscale image with alpha channel view with various programs http://mythic-beasts.com/~mark/all-alpha-bridges.png

RGB image with alpha channel view with various programs http://mythic-beasts.com/~mark/all-alpha-clowns.png

所以看起來好像色彩空間只是被在各種情況下曲解。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; 

...這看起來沒有希望。

如果我加載這些圖像與libjpegexample.c略加修改,是cinfo.jpeg_color_spacecinfo.out_color_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庫來應對它們?

顯然,有至少兩個其他解決方案的更一般的問題:

  1. 更改軟件輸出一般JPEG +代表alpha通道
  2. 不知何故改善Sun的性能的PNG文件ImageIO

......但是第一個代碼會涉及很多代碼更改,並且不清楚如何去處理後者。無論如何,我認爲如何使用libjpeg加載這樣的文件可能是一個更普遍的興趣。

任何建議將不勝感激。

回答

1

你已經試過libjpeg-turbo?它應該能夠解碼RGBA,並且已經有一個Java包裝器。

+0

不,我不知道它!感謝您的建議。 – 2011-06-02 10:19:41

+1

不幸的是,我無法使libjpeg-turbo正確解碼這些圖像,但我接受這是最有幫助的答案。 – 2011-07-07 20:49:06

1

我試着在彩色圖像上運行libjpeg-turbo,它具有alpha通道,並且已經用java的ImageIO保存爲jpeg。

這是我編的libjpeg渦輪增壓的Linux 64位:

$ 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 

我這是怎麼運行斐濟與正確的庫路徑和classpath,包括libjpeg的渦輪增壓:

$ 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 

這是一個小的Jython腳本來讀取JPEG等的α+文件:

 
###### 
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() 
#### 

的問題:沒有質W我使用TJ類中使用的帽子標誌(解壓縮調用中的'0')(請參閱http://libjpeg-turbo.svn.sourceforge.net/viewvc/libjpeg-turbo/trunk/java/doc/org/libjpegturbo/turbojpeg/TJ.html),我無法加載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 

這樣看來,無論是libjpeg的渦輪增壓作爲拯救的ImageIO,或有呼叫一個非常不明顯的設置不能讀取阿爾法JPEG到「解壓縮」我無法把握。

2

即使將圖像作爲4通道jpeg圖像存儲,也不存在標準方式,我知道如何在jpeg文件中指定顏色格式。

JFIF標準假定YCbCr。

相關問題