2010-05-24 69 views
13

寫出TIFF圖像我嘗試下面的代碼來完成讀寫TIFF圖像的任務:閱讀和Java中

// Define the source and destination file names. 
String inputFile = /images/FarmHouse.tif 
String outputFile = /images/FarmHouse.bmp 

// Load the input image. 
RenderedOp src = JAI.create("fileload", inputFile); 

// Encode the file as a BMP image. 
FileOutputStream stream = 
    new FileOutputStream(outputFile); 
JAI.create("encode", src, stream, BMP, null); 

// Store the image in the BMP format. 
JAI.create("filestore", src, outputFile, BMP, null); 

然而,當我運行代碼,我收到以下錯誤信息:

Caused by: java.lang.IllegalArgumentException: Only images with either 1 or 3 bands 
can be written out as BMP files. 
at com.sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.java:123) 
at com.sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.java:79) 

任何想法我能如何解決這個問題?

回答

20

在TIFF和輸出讀取BMP是使用ImageIO類最簡單的方法:

BufferedImage image = ImageIO.read(inputFile); 
ImageIO.write(image, "bmp", new File(outputFile)); 

的唯一額外的事情,你需要做的就是這個工作是確保你」已將JAI ImageIO JAR添加到類路徑中,因爲沒有來自此庫的插件,JRE不處理BMP和TIFF。

如果因爲某些原因無法使用JAI ImageIO,可以使用它來使用現有的代碼,但是您必須做一些額外的工作。正在爲您正在加載的TIFF創建的顏色模型可能是一種不受BMP支持的索引顏色模型。您可以使用JAI.KEY_REPLACE_INDEX_COLOR_MODEL鍵提供渲染提示,將其替換爲JAI.create(「format」,...)操作。

你可能有一些運氣寫從文件中讀取的圖像轉換成一個臨時的圖像,然後寫出臨時圖像:

BufferedImage image = ImageIO.read(inputFile); 
BufferedImage convertedImage = new BufferedImage(image.getWidth(), 
    image.getHeight(), BufferedImage.TYPE_INT_RGB); 
convertedImage.createGraphics().drawRenderedImage(image, null); 
ImageIO.write(convertedImage, "bmp", new File(outputFile)); 

我想知道,如果你正在運行到同一索引顏色模型問題與常規JAI一樣。理想情況下,您應該使用ImageIO類來爲除最簡單的情況之外的所有其他類獲取ImageReader和ImageWriter實例,以便相應地調整讀取和寫入參數,但可以對ImageIO.read()和.write()進行調整以提供給您你想要什麼。

+0

「ImageIO.write(圖像, 」BMP「,新文件(OUTPUTFILE))」 是不僵硬書寫能夠成功地將圖像寫爲「.bmp」文件。當我將代碼更改爲「.tiff」時,它會起作用。 – user224270 2010-05-24 19:20:17

+0

對不起...有一個小的錯字。 ImageIO.write現在應該寫出convertedImage,而不是原始圖像。 – Jeff 2010-05-24 19:24:04

+0

謝謝傑夫。有效!你真的救了我的一天;) – user224270 2010-05-24 19:36:49

0
FileInputStream in = new FileInputStream(imgFullPath); 
FileChannel channel = in.getChannel(); 
ByteBuffer buffer = ByteBuffer.allocate((int)channel.size()); 
channel.read(buffer); 
tiffEncodedImg = Base64.encode(buffer.array()); 

使用此內容在HTML img標籤的SRC值( 「tiffEncodedImg」 的,即價值)