2013-06-27 41 views
6

Có thể đây là một vấn đề rất dễ giải quyết nhưng tôi chưa tìm ra giải pháp hoàn hảo nào. Tôi đang cố gắng để chuyển đổi một png để ICO với C# và tìm thấy những câu hỏi converting .PNG to .ICO in C/C# mà loại đưa ra một giải pháp làm việc như sau:Chuyển đổi png thành ico chất lượng cao

using (FileStream stream = File.OpenWrite(@"C:\temp\test.ico")) 
{ 
    Bitmap bitmap = (Bitmap)Image.FromFile(@"c:\temp\test.png"); 
    Icon.FromHandle(bitmap.GetHicon()).Save(stream); 
} 

Đối với dự án riêng của tôi, tôi đã thay đổi cách tiếp cận này hơi to:

string pngFile = "path/to/pngfile"; 
using (Bitmap bitmap = new Bitmap(pngFile)) 
{ 
    using (Icon icon = Icon.FromHandle(bitmap.GetHicon())) 
    { 
     using (MemoryStream stream = new MemoryStream()) 
     { 
     icon.Save(stream); 
     // something interesting with icon here 
     } 
    } 
} 

Vấn đề mà tôi đang gặp phải là kết quả ico có chất lượng kém, tôi đoán nó đã được thay đổi kích thước thành 16x16 và mất một số độ sâu màu, có lẽ bây giờ chỉ có 16 màu? Làm cách nào tôi có thể chuyển đổi thành tệp ico chất lượng cao hơn?

+0

Bạn có thể thử: https://gist.github.com/darkfall/1656050. Tôi có thể nói với bạn rằng bạn sẽ cần một thứ gì đó mạnh mẽ hơn 'GetHicon' bởi vì đó là một phương pháp nhanh chóng và dơ bẩn, và không có nghĩa là không bị mất mát. – DonBoitnott

+0

@DonBoitnott xin vui lòng gửi bình luận của bạn như là một câu trả lời. Tôi mang nó để làm việc với đề xuất của bạn và tôi tin rằng đây là câu trả lời đúng. – Bazzz

Trả lời

7

tôi tin rằng bạn sẽ cần một phương pháp mạnh mẽ hơn GetHIcon(). Nó là một lựa chọn "nhanh chóng và bẩn" hơn, và không có nghĩa là mất mát.

Dưới đây là một ví dụ về một lớp học mà có thể duy trì chất lượng hình ảnh trên đường để chuyển đổi như ICO:

https://gist.github.com/darkfall/1656050

+0

Kịch bản lệnh Gr8 hoạt động như một nét duyên dáng, nhưng tôi đang nhấn 'Thao tác số học dẫn đến lỗi tràn nếu tôi cố gắng tạo biểu tượng có chiều cao lớn hơn 255 .. có thể do CBYTE() tối đa được phép là 255 - bạn có bất kỳ giải pháp/đề xuất nào để tạo Biểu tượng chất lượng cao bằng cách sử dụng mã của bạn? – VarunC

2

Trong câu hỏi được tham chiếu, giải pháp được chấp nhận sử dụng imagemagick, một công cụ thao tác hình ảnh tuyệt vời cung cấp cho bạn khả năng kiểm soát kích thước, độ sâu màu vv khi chuyển từ png sang ico. Tôi thực sự khuyên bạn nên thử giải pháp đó.

Sử dụng tiện ích ImageMagick sẽ giống như

chuyển đổi -resize trung tâm -gravity x16 -crop 16x16 + 0 + 0 input.png \ -flatten -colors 256 đầu ra/favicon.ico

(sau đó bạn có thể kiểm soát -resize và -colors để đạt được những gì bạn đang tìm kiếm.)

Các tùy chọn tương tự nên có sẵn lập trình trong C# thông qua http://imagemagick.codeplex.com

+0

Xin lỗi vì đã không đề cập đến điều này trong câu hỏi nhưng tôi không muốn phụ thuộc vào các thư viện bên ngoài nếu có thể. Tôi sẽ xem xét đề xuất của bạn nếu mọi thứ khác không thành công. – Bazzz

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