2012-09-18 60 views
1

當我將Bitmap寫入文件並從該文件讀取時,我正確地獲取了透明度。從MemoryStream中加載時在位圖中沒有透明度

using (Bitmap bmp = new Bitmap(2, 2)) 
{ 
    Color col = Color.FromArgb(1, 2, 3, 4); 
    bmp.SetPixel(0, 0, col); 
    bmp.Save("J.bmp"); 
} 

using (Bitmap bmp = new Bitmap("J.bmp")) 
{ 
    Color col = bmp.GetPixel(0, 0); 
    // Value of col.A = 1. This is right. 
} 

但如果我寫的BitmapMemoryStream,並從MemoryStream閱讀,透明度已被刪除。所有的alpha值都變成255

MemoryStream ms = new MemoryStream(); 
using (Bitmap bmp = new Bitmap(2, 2)) 
{ 
    Color col = Color.FromArgb(1, 2, 3, 4); 
    bmp.SetPixel(0, 0, col); 
    bmp.Save(ms, ImageFormat.Bmp); 
} 

using (Bitmap bmp = new Bitmap(ms)) 
{ 
    Color col = bmp.GetPixel(0, 0); 
    // Value of col.A = 255. Why? I am expecting 1 here. 
} 

我希望保存BitmapMemoryStream和讀取它的透明度。我該如何解決這個問題?

+0

在新的Bitmap(ms)調用之前沒有'ms.position = 0'。不知道在這種情況下是否有問題,請發表評論。 –

回答

3

問題是這條線:bmp.Save(ms, ImageFormat.Bmp)。 ImageFormat.Bmp不支持Alpha值,您可以將其更改爲ImageFormat.Png以獲得相同的效果。

+0

+1給'.Png'建議。有點令人驚訝的是,從流中讀取位圖實際上是在流中尋找,但是當我期望一個''新位圖(ms)''之前似乎'ms.position = 0'。 –

2

AFAIK BMP格式不支持透明度。請改變你的格式,比如PNG上:

bmp.Save(ms, ImageFormat.Png); 

但是,您可以指數爲.bmp將在256點增加一個透明的顏色。問題是,bmp的很多圖像需求是24位和32位,而透明索引圖像只能轉換爲16位。