2014-09-28 47 views
0

在這段代碼中,我創建了透明位圖,但着色了列表測試點中黃色的像素。 我該如何保持透明,但像素要着色或保持原來的顏色,而不是黃色?使用與原始顏色保存不安全的位圖寫入透明度?

private void button2_Click(object sender, EventArgs e) 
{ 
    Graphics g; 
    g = Graphics.FromImage(bmpBackClouds); 
    g.Clear(Color.Transparent); 
    g.Dispose(); 
    BitmapData b1 = bmpBackClouds.LockBits(new System.Drawing.Rectangle(0, 0, 
        bmpBackClouds.Width, bmpBackClouds.Height), 
        System.Drawing.Imaging.ImageLockMode.ReadWrite, 
        System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

    int stride = b1.Stride; 
    int i; 

    System.IntPtr Scan0 = b1.Scan0; 

    unsafe 
    { 
     byte* p; 

     for (i = 0; i < testpoints.Count; i++) 
     { 
      p = (byte*)(void*)Scan0; 

      p += (int)testpoints[i].Y * stride + (int)testpoints[i].X * 4; 

      p[1] = p[2] = (byte)255; 
      p[0] = (byte)0; 
      p[3] = (byte)255; 
     } 
    } 
    bmpBackClouds.UnlockBits(b1); 
    bmpBackClouds.Save(@"c:\temp\yellowbmpcolor.png", ImageFormat.Png); 
} 
+0

'p [3] =(byte)255;'使像素不透明。將其改爲'p [3] =(byte)0;'使其變爲透明。請勿觸摸其他字節以保持其原始顏色。 – TaW 2014-09-28 08:26:15

+0

我將它改爲p [3] =(byte)0;我現在在硬盤上得到的是空白的黑色圖像,當我編輯它時,我看到它全部沒有任何內部的白色。也許我的東西是如何在構造函數中第一次啓動bmpBackClouds? bmpBackClouds =新的位圖(pictureBox1.Width,pictureBox1.Height,PixelFormat.Format32bppArgb); – 2014-09-28 10:17:50

+0

什麼是'testPoints'? – TaW 2014-09-28 10:26:11

回答

1

你的代碼將正常工作與一個微小的修正:

刪除,你刪除的圖像部分:

Graphics g; 
g = Graphics.FromImage(bmpBackClouds); 
g.Clear(Color.Transparent); 
g.Dispose(); 

這將消滅的形象和你結了沒有什麼。

然後改變這個

 p[1] = p[2] = (byte)255; 
     p[0] = (byte)0; 
     p[3] = (byte)255; 

於後:

 p[3] = 0; 

的部分在測試點名單將是透明的,用自己的顏色通道完好。

這是有點很難看到;-)

最好的測試是讀回並恢復alpha通道,瞧,原來的圖像又回來了!

注意如果你想使整個Bitmap透明的第一行 - 這是行不通的。 GDI對透明度的處理有一個錯誤;大概是爲了節省時間,當你嘗試使用它來形成圖像的一部分或全部透明時,它不會保留原始顏色。這是真的既爲Graphics.Clear和其他Graphics方法,如Graphics.FillRectangle等。

..所以,如果你想徹底清除圖像的Alpha通道,就像上面使用的代碼這樣做,顯然沒有列表,並與在所有像素上循環...

+0

你所做的與「g.Clear(Color.Transparent);」完全相同。所以保持「g.Clear(Color.Transparent);」並且不鎖定解鎖圖像。根本沒有錯誤。它確實使位圖透明 – 2014-09-28 15:36:30

+0

錯誤的兩個計數。清除將清除圖像。明顯。這不是要求的。透明度錯誤是衆所周知的,請參閱[這裏](http://stackoverflow.com/questions/25236422/why-does-system-drawing-graphics-blank-the-rgb-channels-when-alpha-0) – TaW 2014-09-28 15:42:34

+0

清除意味着清晰。沒有錯誤。它將所有東西都置零。你沒有注意到OP的第一個評論。位圖不包含任何要保留的顏色信息。用「g.Clear(Color.Transparent)」;「 OP看到一個黑色圖像(保存後),他認爲它不透明。這就是他問這個問題的原因。 – 2014-09-28 16:06:33