2010-04-27 83 views
2

我有一個Java網站,現在我建立了一個上傳器,完成了對JPG圖像的驗證並將其保存到服務器中。Java:檢測圖像是GIF還是isTIFF並轉換爲JPG

但現在我需要創建使用isGIF一個實用工具類和isTIFF按字節[]驗證他們並轉換該字節[]到java.awt.Image中保存爲JPG

所以基本上我需要布爾isGIF(byte[])boolean isTIFF(byte[])java.awt.Image convertGIF(byte[])java.awt.Image convertTIFF(byte[])

但我不知道該怎麼做,有人可以幫我嗎?

謝謝!

+0

http://www.tutorialized。com/view/tutorial/Convert-a-GIF-to-a-JPG-in-Java/28666 – Jack 2010-04-27 20:22:49

回答

1

你可以考慮使用的mime utils的讀取它們。它基本上使用unix file命令使用的相同檢測爲給定的byte []或流源提供MIME類型。

http://www.medsea.eu/mime-util(似乎目前不可用,請嘗試查看Google緩存中的信息)。

您也可以考慮簡單地使用ImageIO.read解析每個圖像,然後使用ImageIO.write重寫它們。這也適用於JPEG圖像,但它不是完全有效的。如果您想同時縮放,裁剪或嵌入圖像,這將是一個合適的解決方案。由於這是Web提交的數據,因此嘗試將文件解析爲圖像以確保它確實是圖像而不是惡意文件類型是有一定爭論的。

ImageIO非常智能,所以您不必知道數據以何種類型開始。如果數據格式不正確,它會通過例外,所以這確保您的圖像數據是有效的。

JPEG文件顯然是以0xFFD8開頭的,所以你可以在你的代碼中檢查。

例如,簡單地重新編碼每一個形象,看起來並不像一個JPEG:

byte[] bytes = new byte[1024]; //your input 
byte[] result = bytes; 
if(bytes[0] != 0xFF || bytes[1] != 0xD8) 
{  
    BufferedImage image = ImageIO.read(new ByteArrayInputStream(bytes)); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ImageIO.write(image, "jpeg", baos); 
    result = baos.toByteArray(); 
} 
+0

尋找代碼示例,我不知道如何構建。 – BoDiE2003 2010-04-27 20:22:31

+1

不幸的是我不想寫一個,我給了很多信息,ImageIO很簡單,我可能會很快更新這個細節。 – Geoff 2010-04-27 20:25:38

1

大多數image formats以唯一標識符i.g.開頭。

000:47 49 46 38 39 61的GIF89a部首

你可以使用Java Advanced Imaging I/O

+0

尋找一個代碼示例,我不知道如何構建。 – BoDiE2003 2010-04-27 20:23:08

+0

似乎更容易匹配一個目標編碼並首先重新編碼其他所有內容,我已將這個示例添加到我的答案中。根據我的來自apache的mime魔術文件,JPEG文件以0xFFD8開頭。 – Geoff 2010-04-27 20:48:45

0

Java ImageIO包(特別ImageIO類)有許多方法來讀取和寫入圖像。您可以通過後綴查找讀者並查看他們是否在目標文件或字節數組上工作來實現您的想法。

儘管Stacker關於查看文件頭幾個字節的想法可能會更好,因爲您可能只需讀取文件的前幾個字節即可實現目標。

0

使用Java Advanced Imaging API進行轉換我已經能夠將字節流轉換爲JPEG,JPG,BMP,GIF等,而且它非常簡單。我希望這個例子有幫助!

import java.awt.image.RenderedImage; 
import java.io.IOException; 

import javax.media.jai.JAI; 
import com.sun.media.jai.codec.ByteArraySeekableStream; 
import com.sun.media.jai.codec.SeekableStream; 


public class ImageConverter 
{ 
    public static void convertImage(byte[] image, String targetFormat, String filename) 
    { 
    try 
    { 
     SeekableStream stream = new ByteArraySeekableStream(image); 

     // read stream into a rendered image 
    RenderedImage renderedImage = JAI.create("stream", stream); 

     // persist image to file 
    JAI.create("filestore", renderedImage, filename, targetFormat); 

    stream.close(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
}