2016-03-18 18 views
1

正如標題所說。使用SWT的ImageData,如何判斷一個png,gif,bmp文件是否具有透明度?

我嘗試確定給定的圖像文件是否具有透明度(非透明)。

這是正確的做法:

public static boolean hasAlpha(ImageData imageData) { 
    if (imageData.alpha != -1 || imageData.transparentPixel != -1) 
     return true; 
    if (imageData.alphaData == null && imageData.maskData == null) 
     return false; 
    if (imageData.alphaData != null) 
     for (int i = 0; i < imageData.alphaData.length; ++i) { 
      byte alpha = imageData.alphaData[i]; 
      if (alpha !=0xFF) 
       return true; 
     } 
    if (imageData.maskData != null) 
     for (int i = 0; i < imageData.maskData.length; ++i) 
      if (imageData.maskData[i] != 0xFF) 
       return true; 
    return false; 
} 

有沒有更好的辦法比翻閱整個alpha通道(使用我製作的循環)?也許甚至沒有將整個圖像文件解碼爲解碼的大位圖?

+0

您可能還需要查看'maskData'中的透明度蒙版數據。 –

+0

@ greg-449它甚至如何使用?無論如何,如果它不是空的,這是否意味着它有alpha?我認爲這只是圖像的一個額外的元數據,要顯示它的一個小版本,不是嗎?所以我認爲不需要檢查。 –

+0

不,它似乎是在主圖像中每個像素具有一個位的位掩碼,其中1位表示alpha是255並且是零alpha 0.通常通過調用ImageData.getTransparencyMask –

回答

0

我看到一些問題。

ImageData.alpha可以設置爲255,這意味着完全不透明,只有0-254透明。

ImageData.alphaData對於每個字節,只有值255是完全不透明的。

ImageData.maskData爲使掩碼不透明,每個字節的所有位都必須爲1。

您可能還想考慮'透明'的含義。 α值爲254意味着圖像只是非常透明,值爲0意味着圖像根本不可見。

+0

通過「透明」我的意思是它不是100%不透明,就像透明的玻璃,即使它變得有點髒,就像你可以透過它看到的一樣。你可以請顯示正確的代碼?我修改了代碼,因爲我認爲我是用相反的邏輯寫的。現在好嗎? –

+0

說,如果我添加一個檢查imageData.type == SWT.IMAGE_JPEG,這也可以確定圖像是否沒有透明度(因爲JPG不支持它),但出於某種原因,我得到-1方式。怎麼會這樣? –

相關問題