2010-03-24 31 views
6

Cách tốt nhất để đặt thành phần RGB của mỗi pixel trong một System.Drawing.Bitmap thành một màu đơn, là gì? Nếu có thể, tôi muốn tránh lặp theo cách thủ công qua từng pixel để thực hiện việc này.GDI +: Đặt tất cả các pixel thành màu đã cho trong khi vẫn giữ lại giá trị alpha hiện tại

Lưu ý: Tôi muốn giữ nguyên thành phần alpha từ bitmap gốc. Tôi chỉ muốn thay đổi giá trị RGB.

Tôi đã xem xét sử dụng ColorMatrix hoặc ColorMap, nhưng tôi không thể tìm thấy bất kỳ cách nào để đặt tất cả pixel thành một màu cụ thể với phương pháp tiếp cận.

Trả lời

13

Có, sử dụng ColorMatrix. Nó nên trông như thế này:

0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 1 0 
    R G B 0 1 

đâu R, G và B là những giá trị màu thu nhỏ của màu sắc thay thế (chia 255.0f)

+0

Điều này không đặt màu của từng pixel thành một màu cụ thể, phải không? Tôi khá chắc chắn rằng sẽ tăng từng kênh màu bằng R, G & B. Tôi muốn toàn bộ hình ảnh là một màu đồng nhất, trong khi vẫn giữ được độ trong suốt/alpha của mỗi pixel. – Charles

+1

Các số không trong đường chéo tạo ra màu đen, các số dưới cùng được thêm vào. –

+0

Ah-ha. Tôi đã không nghĩ hết. Tôi cá rằng nó sẽ hoạt động hoàn hảo. Tôi sẽ kiểm tra và quay lại ngay với bạn. – Charles

2

Tùy chọn tốt nhất (về mặt hoàn thiện, ít nhất) là sử dụng Bitmap.LockBits và lặp qua dữ liệu pixel trong dòng quét, thiết lập giá trị RGB.

Vì bạn không muốn thay đổi Alpha, bạn sẽ phải lặp qua từng pixel - không có phép gán bộ nhớ duy nhất sẽ giữ alpha và thay thế RGB, vì chúng xen kẽ nhau.

+0

1. Cảm ơn Reed, có lẽ tôi sẽ sử dụng nó cho một số thứ khác mà tôi đang làm. – Charles

6

Tôi biết điều này đã được trả lời, nhưng dựa trên Hans passant của trả lời các mã kết quả trông giống như sau:

public class Recolor 
{ 
    public static Bitmap Tint(string filePath, Color c) 
    { 
     // load from file 
     Image original = Image.FromFile(filePath); 
     original = new Bitmap(original); 

     //get a graphics object from the new image 
     Graphics g = Graphics.FromImage(original); 

     //create the ColorMatrix 
     ColorMatrix colorMatrix = new ColorMatrix(
      new float[][]{ 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 0, 0}, 
        new float[] {0, 0, 0, 1, 0}, 
        new float[] {c.R/255.0f, 
           c.G/255.0f, 
           c.B/255.0f, 
           0, 1} 
       }); 

     //create some image attributes 
     ImageAttributes attributes = new ImageAttributes(); 

     //set the color matrix attribute 
     attributes.SetColorMatrix(colorMatrix); 

     //draw the original image on the new image 
     //using the color matrix 
     g.DrawImage(original, 
      new Rectangle(0, 0, original.Width, original.Height), 
      0, 0, original.Width, original.Height, 
      GraphicsUnit.Pixel, attributes); 

     //dispose the Graphics object 
     g.Dispose(); 

     //return a bitmap 
     return (Bitmap)original; 
    } 
} 

Tải về một bản demo làm việc ở đây: http://benpowell.org/change-the-color-of-a-transparent-png-image-icon-on-the-fly-using-asp-net-mvc/

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