2009-10-26 9 views
7

Praca w programie Visual Studio 2008. Próbuję narysować obraz PNG i zapisać go ponownie.Problem z obrazami PNG w języku C#

I wykonaj następujące czynności:

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

A w konstruktorze:

newGraphics = Graphics.FromImage(img); 

Budowanie rozwiązanie daje żadnych błędów. Gdy próbuję go uruchomić, mam to:

obiekt graficzny nie mogą być tworzone z obrazu, który ma indeksowany formatu pikseli.

Nie mam dużego doświadczenia w korzystaniu z obrazów w języku C#. Co to oznacza i jak mogę temu zaradzić?

EDYCJA: poprzez debugowanie, Visual Studio mówi mi, że obraz ma format pikseli w formacie format8bppindexed.

Więc jeśli nie mogę korzystać z klasy Graphics, czego używam?

EDIT2: Po przeczytaniu this, myślę, że można bezpiecznie założyć, że lepiej trzymać się plików JPG podczas pracy z GDI +, nie?

Edit3: moi using-deklaracje:

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

Wszelkie powodzenia tej metody? http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx – Greg

+0

Używam plików PNG z obiektem Graphics przez cały czas. Opublikuj link do pliku PNG, którego używamy, a zobaczymy, co jest z nim nie tak. – MusiGenesis

+0

Wewnętrznie GDI współpracuje z bitmapami, JPG jest skompresowany i niezbyt świetnie posiada skompresowany obraz do pracy z nieprzetworzonymi danymi. Twój obraz ma 8bppIndexed, jest to format bitmapowy, w którym kolory są przechowywane w palecie, a nie w pikselach. Obiekty Graphics nie mogą bezpośrednio modyfikować wartości pikseli, ponieważ to ich nie zmieni. Musisz przekonwertować go na 24bppRGB – badbod99

Odpowiedz

9

Bez lepszej biblioteki PNG, który obsługuje indeksowane PNG masz pecha próbując wyciągnąć do tego obrazu, ponieważ ewidentnie GDI + obiekt graficzny nie obsługuje indeksowanych obrazy.

Jeśli nie potrzebujesz indeksowanych plików PNG, możesz uwięzić ten błąd i przekonwertować dane wejściowe na zwykłe pliki PNG RGB za pomocą narzędzia innej firmy.

edit:

znalazłem ten link http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html który daje metodę rysowania na obrazie, jednak nie wpłynie to oryginał, tylko kopia można zapisać(), jeśli wymagają.

W przypadku awarii łącza:

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 + nie obsługuje tworzenia kontekstu graficznego, który ma taki sam efekt dla OP. Tak czy inaczej, oto przyzwoity link do obejścia: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html –

+0

Ten blog zrobił to. Dzięki. – KdgDev

12

Nie można utworzyć grafikę z indeksowanego formatu obrazu (PNG, GIF, ...). Należy użyć mapy bitowej (plik lub przekonwertować obraz na bitmapę).

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

Rzeczywiście, tam martwy link. – KdgDev

+0

Być może nie mam potrzebnej instrukcji "using", ale Visual Studio nie rozpoznaje tej funkcji. – KdgDev

+0

Która funkcja? – Guillaume