2009-10-26 3 views
7

Arbeiten in Visual Studio 2008. Ich versuche, auf ein PNG-Bild zu zeichnen und das Bild erneut zu speichern.Problem mit PNG-Bildern in C#

ich folgendes tun:

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

Und im Konstruktor:

newGraphics = Graphics.FromImage(img); 

Aufbau der Lösung keine Fehler gibt. Wenn ich versuche, es zu laufen, ich diese:

Ein Graphics-Objekt kann nicht von einem Bild geschaffen werden, die eine indizierte Pixelformat hat.

Ich habe nicht viel Erfahrung mit der Verwendung von Bildern in C#. Was bedeutet das und wie kann ich Abhilfe schaffen?

EDIT: durch Debugging, Visual Studio sagt mir, dass das Bild ein format8bppindexed Pixel Format hat.

Also, wenn ich die Grafikklasse nicht verwenden kann, was verwende ich?

EDIT2: Nach dem Lesen this, ich denke, es ist sicher anzunehmen, dass ich besser bei JPG-Dateien bei der Arbeit mit GDI + bleiben, nein?

EDIT3: meine using-Anweisungen:

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

Glück gehabt mit dieser Methode? http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx – Greg

+0

Ich benutze PNG-Dateien mit dem Graphics-Objekt die ganze Zeit. Veröffentlichen Sie einen Link zu der PNG-Datei, die Sie verwenden, und wir werden sehen, was damit nicht stimmt. – MusiGenesis

+0

Intern GDI arbeitet mit Bitmaps, JPG ist komprimiert und nicht wirklich toll, ein komprimiertes Bild für die Arbeit mit den Rohdaten. Ihr Bild ist 8bppIndexed, dies ist ein Bitmap-Format, in dem die Farben in der Palette gespeichert werden und nicht die Pixeldaten. Die Graphics-Objekte können die Pixelwerte nicht direkt ändern, da sie dies nicht ändern. Sie müssen es in 24bppRGB konvertieren – badbod99

Antwort

9

Ohne eine bessere PNG-Bibliothek, die PNG-Dateien indiziert unterstützen Sie kein Glück versuchen, da offenbar die GDI + Grafiken zu diesem Bild zu zeichnen das Objekt nicht indizieren Bilder unterstützen.

Wenn Sie keine indizierten PNGs verwenden müssen, können Sie diesen Fehler abfangen und Ihre Eingabe mithilfe eines Dienstprogramms von Drittanbietern in normale RGB-PNGs konvertieren.

edit:

ich diesen Link http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html finden tat, das ein Verfahren gibt auf dem Bild zu zeichnen, aber es wird nicht das Original beeinflussen, nur eine Kopie, die Sie speichern können(), wenn Sie benötigen.

Im Fall geht der Link unten:

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 + unterstützt nicht das Erstellen eines Grafikkontexts von ihnen, der den gleichen Effekt für das OP hat. Wie auch immer, hier ist ein anständiger Link für eine Workaround-Lösung: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html –

+0

Dieser Blogpost hat es getan. Vielen Dank. – KdgDev

12

Sie können keine Grafiken aus einem indizierten Bildformat (PNG, GIF, ...) erstellen. Sie sollten eine Bitmap (Datei oder konvertieren Sie Ihr Bild in eine Bitmap).

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

In der Tat, tote Verbindung dort. – KdgDev

+0

Vielleicht habe ich nicht die benötigte "using" -Anweisung, aber Visual Studio erkennt diese Funktion nicht. – KdgDev

+0

Welche Funktion? – Guillaume