2009-10-26 29 views
7

Làm việc trong Visual Studio 2008. Tôi đang cố gắng vẽ trên hình ảnh PNG và lưu lại hình ảnh đó.Sự cố với hình ảnh PNG trong C#

tôi làm như sau:

private Image img = Image.FromFile("file.png"); 
private Graphics newGraphics; 

Và trong constructor:

newGraphics = Graphics.FromImage(img); 

Xây dựng giải pháp cho không có lỗi. Khi tôi cố gắng chạy nó, tôi có được điều này:

đối tượng A Graphics không thể tạo từ một hình ảnh có định dạng điểm ảnh được lập chỉ mục.

Tôi không có nhiều kinh nghiệm về việc sử dụng hình ảnh trong C#. Điều này có nghĩa là gì và làm thế nào tôi có thể khắc phục điều này?

EDIT: thông qua gỡ lỗi, Visual Studio cho tôi biết rằng hình ảnh có định dạng format8bppindexed pixel.

Vì vậy, nếu tôi không thể sử dụng lớp Đồ họa, tôi nên sử dụng cái gì?

EDIT2: Sau khi đọc this, tôi nghĩ rằng an toàn để giả định rằng tôi nên gắn bó với tệp JPG khi làm việc với GDI +, không?

EDIT3: tôi sử dụng-báo cáo:

using System; 
using System.Collections.Generic; 
using System.Drawing; 
using System.Drawing.Imaging; 
using System.Windows.Forms; 
+0

Bất kỳ may mắn với phương pháp này? http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx – Greg

+0

Tôi sử dụng tệp PNG với đối tượng Đồ họa mọi lúc. Đăng liên kết tới tệp PNG bạn đang sử dụng và chúng tôi sẽ thấy có vấn đề gì với nó. – MusiGenesis

+0

GDI nội bộ hoạt động với Bitmap, JPG được nén và không thực sự tuyệt vời khi có hình ảnh nén để làm việc với dữ liệu thô. Hình ảnh của bạn là 8bppIndexed, đây là một định dạng bitmap, nơi các màu sắc được lưu trữ trong bảng màu không phải là dữ liệu pixel. Các đối tượng đồ họa không thể thay đổi trực tiếp các giá trị pixel, vì điều đó sẽ không thay đổi giá trị đó. Bạn cần phải chuyển đổi nó thành 24bppRGB – badbod99

Trả lời

9

Nếu không có một thư viện PNG tốt hơn có hỗ trợ lập chỉ mục PNG bạn đang trên may mắn cố gắng để vẽ hình ảnh rằng kể từ khi đồ họa rõ ràng GDI + đối tượng không hỗ trợ hình ảnh được lập chỉ mục.

Nếu bạn không cần sử dụng PNG được lập chỉ mục, bạn có thể bẫy lỗi đó và chuyển đổi đầu vào của bạn thành RGB PNG thông thường bằng tiện ích của bên thứ ba.

chỉnh sửa:

Tôi đã tìm thấy link này http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html rằng đưa ra một phương pháp để vẽ trên hình ảnh của bạn, tuy nhiên nó sẽ không ảnh hưởng đến bản gốc, chỉ là một bản sao bạn có thể Save() nếu bạn yêu cầu.

Trong trường hợp liên kết đi xuống:

Bitmap bm = (Bitmap) System.Drawing.Image.FromFile("Fci-h.jpg",true); 
Bitmap tmp=new Bitmap (bm.Width ,bm.Height); 
Graphics grPhoto = Graphics.FromImage(tmp); 
grPhoto.DrawImage(bm, new Rectangle(0, 0, tmp.Width , tmp.Height), 0, 0, tmp.Width , tmp.Height , GraphicsUnit.Pixel); 
+0

GDI + không hỗ trợ tạo ngữ cảnh đồ họa từ chúng có tác dụng tương tự cho OP. Dù sao, đây là một liên kết tốt cho một giải pháp workaround: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html –

+0

Đó là blogpost đã làm nó. Cảm ơn. – KdgDev

12

Bạn không thể tạo đồ họa từ một định dạng hình ảnh được lập chỉ mục (PNG, GIF, ...). Bạn nên sử dụng một Bitmap (tệp hoặc chuyển đổi hình ảnh của bạn thành một bitmap).

Image img = Image.FromFile("file.png"); 
img = new Bitmap(img); 
newGraphics = Graphics.FromImage(img); 
+0

Thật vậy, liên kết chết ở đó. – KdgDev

+0

Có lẽ tôi không có câu lệnh "sử dụng" cần thiết, nhưng Visual Studio không nhận ra hàm đó. – KdgDev

+0

Chức năng nào? – Guillaume

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