2011-02-15 30 views
6

Sử dụng WebImage từ bản phát hành MVC3/WebMatrix. Tải hình ảnh sau đây từ một đường dẫn tập tin:Tại sao WebImage.Resize loại bỏ độ trong suốt PNG

Sample Image - hoặc - enter image description here

Chạy đoạn mã sau chống lại nó:

return new WebImage(path) 
     .Resize(120, 265) 
     .GetBytes("Png"); 

Kết quả trong một hình ảnh với tính minh bạch tước ra và đen sử dụng tại chỗ :

Blacked out transparency

Điều tương tự cũng xảy ra với RotateRight(), Rota teLeft() và FlipHorizantal() Tuy nhiên, nếu tôi không gọi phương thức .Resize():

return new WebImage(path) 
     .GetBytes("Png"); 

Hình ảnh được trả về mà không có vấn đề gì.

+0

Phần hình ảnh web là gì? – Craigt

+0

System.Web.WebImage được xuất xưởng như một phần của MVC3 và/hoặc WebMatrix mà tôi tin tưởng. –

+1

Bạn có thể đăng liên kết đến hình ảnh thực tế của mình không? Các dịch vụ hình ảnh mà SO sử dụng tiếc là recompresses điều vì vậy nếu có một cái gì đó đặc biệt về hình ảnh cụ thể của bạn, chúng tôi không thể nhìn thấy nó. –

Trả lời

2

Hình ảnh của bạn có phải là 8 bit (màu được lập chỉ mục) không? Khi hình ảnh 8-bit được thay đổi kích thước, chúng thường được chuyển đổi từ màu được lập chỉ mục sang RGB để làm cho kết quả trông mượt mà hơn. Thay đổi kích thước hình ảnh mà không thay đổi bảng màu hiếm khi kết thúc tốt.

Nếu hình ảnh đã là RGB (24 bit trở lên), phức tạp hơn một chút: Trình chỉnh sửa sẽ làm gì cho các cạnh của hình ảnh, trên đường viền giữa "trong suốt" và "không trong suốt"? Nhiều thuật toán thay đổi kích thước sẽ làm một cái gì đó giống như "trung bình hai màu" ở một đường viền (một lần nữa, để làm cho hình ảnh mượt mà hơn), nhưng hầu hết không có khái niệm về độ trong suốt, cho phép khả năng của PNG có nhiều mức độ mờ.

Vì vậy, câu trả lời ngắn gọn là "đó có thể là lỗi" - không phải là triển khai đầy đủ các tính năng của PNG.

Các giải pháp có thể không tồn tại, nhưng tôi muốn thử:

  1. Stay in màu 8-bit nếu đó là một lựa chọn, hoặc chuyển đổi trước thời hạn đến 32-bit.
  2. Lấy màu hoặc chỉ mục màu, có màu trong suốt. Sau khi thay đổi kích thước, buộc giá trị đó phải trong suốt. Lưu ý rằng do "làm mịn" nói trên, các cạnh giữa trong suốt và không trong suốt có thể không phải là màu đó, và có thể sẽ giống như một số pha trộn của màu đen và bất kỳ màu nào bạn thực sự muốn.
  3. Nếu không có gì khác, bạn có thể cần phải sử dụng thư viện bên ngoài mang lại cho bạn nhiều quyền kiểm soát hơn.
+0

Tôi biết nó là hoàn toàn khả thi với WPF/System.Windows.Imaging.Media vì vậy tôi có thể phải quay trở lại những khẩu súng lớn trên cái này. –

0

Bạn đã cố gắng sử dụng phương thức Write() thay vì GetBytes()?

+0

'Write()' không may gọi 'GetBytes()' trong cảnh. –

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