2012-05-18 32 views
9

Tôi đang sao chép hình ảnh. (Mã thực tế của tôi đang thay đổi kích thước hình ảnh nhưng điều đó không liên quan đến câu hỏi của tôi.) Mã của tôi trông giống như thế này.Sử dụng Graphics.DrawImage() để Vẽ hình ảnh với Kênh trong suốt/Alpha

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

Điều này có vẻ hoạt động tốt trừ khi src được tải từ hình ảnh có độ trong suốt (chẳng hạn như GIF) hoặc kênh alpha (chẳng hạn như PNG).

Làm cách nào để có được DrawImage() để chuyển kênh trong suốt/alpha sang hình ảnh mới, sau đó giữ chúng khi tôi lưu tệp?

+0

Câu hỏi đặt ra là giá trị của biến 'saveFormat' là gì? Nó phải là 'PixelFormat.Format32bppArgb' (hoặc một định dạng khác với kênh alpha được xử lý). Hãy thử thêm: 'using (Image dest = new Bitmap (chiều rộng, chiều cao, PixelFormat.Format32bppArgb))'. –

+0

Điều này dường như hoạt động đối với các kênh alpha, nhưng không hoạt động đối với các hiệu ứng trong suốt của GIF. 'saveFormat' sẽ thay đổi tùy thuộc vào định dạng của tệp đầu vào. Nếu tệp đầu vào không hỗ trợ kênh alpha, thì an toàn để giả định hình ảnh sẽ không chứa pixel kênh alpha. –

+0

Vì vậy, giá trị của 'saveFormat' cho các tệp GIF sau đó là gì :)? –

Trả lời

22

Khá rõ ràng, có rất nhiều điều bạn không nói. Vấn đề lớn nhất với tính minh bạch là bạn không thể nhìn thấy nó. Bạn bỏ qua một vài bước, bạn đã không xác định rõ ràng định dạng pixel của bitmap mới của bạn, bạn đã không khởi tạo nó ở tất cả và bạn không nói định dạng đầu ra bạn sử dụng. Một số không hỗ trợ tính minh bạch. Vì vậy, hãy tạo một phiên bản làm cho nó rõ ràng. Từ một hình ảnh PNG trông như thế này trong paint.net:

enter image description here

Sử dụng mã này

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

sản xuất hình ảnh này:

enter image description here

Bạn có thể thấy rõ nền màu xanh để minh bạch làm việc.

+1

Vâng, ý định của tôi là hỗ trợ bất kỳ định dạng nào khớp với tệp đầu vào. Tôi nghĩ tôi khá cụ thể. Chỉ là mã không có nghĩa là chỉ hỗ trợ một loại tệp. Có lẽ tôi cần một loạt mã để xử lý từng loại tệp - tôi không biết. Tôi đã thử chỉ định PixelFormat như bạn có, nhưng sau đó nó có vẻ như đã gây ra lỗi khi loại tệp là GIF với độ trong suốt. Và, trên thực tế, một số biến thể dường như hoạt động tốt với PNG mà không chỉ định PixelFormat. –

+0

@JonathanWood tạo một bitmap mới với chiều rộng và chiều cao của bitmap cũ và định dạng mong muốn mới của bạn. Tốt hơn trong câu lệnh 'using', tạo đối tượng Graphics' FromImage ('bitmap mới')' và 'DrawImage (' bitmap cũ') '. –

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