2010-08-01 41 views
6

Tôi đang làm việc với Bitmap C# và tự hỏi cách chuyển đổi hình ảnh png màu thành chỉ một màu. Tôi muốn tất cả các màu có thể nhìn thấy trong hình ảnh trở thành màu trắng. Các bộ phận trong suốt nên vẫn trong suốt. Tôi sẽ hiển thị những lần này một nền màu xám.Chuyển đổi màu png trong suốt thành màu đơn

+0

thể trùng lặp của [GDI +: Đặt tất cả các điểm ảnh màu được trong khi vẫn giữ giá trị alpha hiện] (http://stackoverflow.com/questions/2510013/gdi-set-all- pixel-to-given-color-while-retaining-existing-alpha-value) –

+0

Có bất kỳ điều gì tôi có thể thêm vào câu trả lời của tôi, vì bạn chưa chấp nhận bất kỳ câu trả lời nào không? – Cloudanger

+0

Xin chào và xin lỗi vì trả lời muộn. Tôi đã thử mã ngay bây giờ và tôi không thể làm cho nó hoạt động. Tất cả các điểm ảnh của tôi chuyển sang màu trắng và nó không để lại các điểm ảnh trong suốt của phần còn lại của png. – jesperlind

Trả lời

7

Các câu trả lời khác hữu ích và giúp tôi tiếp tục, cảm ơn rất nhiều. Tôi không thể làm cho họ làm việc mặc dù, không chắc chắn lý do tại sao. Nhưng tôi cũng phát hiện ra rằng tôi muốn giữ nguyên giá trị alpha ban đầu của các pixel, làm cho các cạnh trơn tru. Đây là những gì tôi nghĩ ra.

for (int x = 0; x < bitmap.Width; x++) 
{ 
    for (int y = 0; y < bitmap.Height; y++) 
    { 
     Color bitColor = bitmap.GetPixel(x, y); 
     //Sets all the pixels to white but with the original alpha value 
     bitmap.SetPixel(x, y, Color.FromArgb(bitColor.A, 255, 255, 255)); 
    } 
} 

Đây là một bãi chứa màn hình của kết quả phóng đại một vài lần (bản gốc trên đầu trang): alt text http://codeodyssey.se/upload/white-transparent.png

+0

Hoạt động nhờ tuyệt vời! – CareTaker22

1

thử đoạn mã sau:

void Test() 
    { 
     Bitmap bmp = new Bitmap(50, 50);//you will load it from file or resource 

     Color c = Color.Green;//transparent color 

     //loop height and width. 
     // YOU MAY HAVE TO CONVERT IT TO Height X VerticalResolution and 
     // Width X HorizontalResolution 
     for (int i = 0; i < bmp.Height; i++) 
     { 
      for (int j = 0; j < bmp.Width; j++) 
      { 
       var p = bmp.GetPixel(j, i);//get pixle at point 

       //if pixle color not equals transparent 
       if(!c.Equals(Color.FromArgb(p.ToArgb()))) 
       { 
        //set it to white 
        bmp.SetPixel(j,i,Color.White); 
       } 
      } 
     } 
    } 

PS: đây không phải là thử nghiệm và không có cách nào tối ưu

7

Nếu hình ảnh không sử dụng kênh alpha cho minh bạch thì sau đây sẽ làm:

Bitmap image; 

for (int x = 0; x < image.Width; x++) 
{ 
    for (int y = 0; y < image.Height; y++) 
    { 
     if (image.GetPixel(x, y) != Color.Transparent) 
     { 
      image.SetPixel(x, y, Color.White); 
     } 
    } 
} 
4

SetPixel chỉ là về cách chậm nhất có thể để làm điều đó. Bạn có thể sử dụng một ColorMatrix thay vì:

var newImage = new Bitmap(original.Width, original.Height, 
          original.PixelFormat); 

using (var g = Graphics.FromImage(newImage)) { 
    var matrix = new ColorMatrix(new[] { 
     new float[] { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 1.0f, 0.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 1.0f, 0.0f, 0.0f }, 
     new float[] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f }, 
     new float[] { 1.0f, 1.0f, 1.0f, 0.0f, 1.0f } 
    }); 

    var attributes = new ImageAttributes(); 

    attributes.SetColorMatrix(matrix); 

    g.DrawImage(original, 
       new Rectangle(0, 0, original.Width, original.Height), 
       0, 0, original.Width, original.Height, 
       GraphicsUnit.Pixel, attributes); 
} 
+0

Chắc chắn thanh lịch hơn, với lợi ích bổ sung là yêu cầu một người học toàn bộ không gian màu mới, một khái niệm mới về thao tác màu sắc và sử dụng kiến ​​thức mới để hiểu những gì bạn vừa làm. :) Tôi thích nó! –

+0

PS: Cú pháp C# của bạn là tốt, miễn là 'using System.Drawing;' và 'sử dụng System.Drawing.Imaging;' được đặt ra. –

Các vấn đề liên quan