Проблема с PNG-изображениями в C#

работа в Visual Studio 2008. Я пытаюсь нарисовать PNG-изображение и сохранить его снова.

Я делаю следующее:

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

и в конструкторе:

newGraphics = Graphics.FromImage(img);

построение решения не дает ошибок. Когда я пытаюсь запустить его, я получаю следующее:

невозможно создать графический объект из изображения с индексированным формат точек.

у меня нет большого опыта использования изображений в C#. Что? означает ли это и как я могу это исправить?

EDIT: через отладку Visual Studio сообщает мне, что изображение имеет format8bppindexed Формат Пикселей.

Итак, если я не могу использовать класс Graphics, что мне использовать?

EDIT2: после чтения этой, я думаю, можно с уверенностью предположить, что мне лучше придерживаться JPG-файлов при работе с GDI+, нет?

EDIT3: мои операторы using -:

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

2 ответов


без лучшей библиотеки PNG, которая поддерживает индексированные png, вам не повезло, пытаясь привлечь к этому изображению, поскольку, очевидно, объект GDI + graphics не поддерживает индексированные изображения.

Если вам не нужно использовать индексированные PNGs, вы можете поймать эту ошибку и преобразовать свой ввод в обычные RGB PNGs с помощью сторонней утилиты.

изменить:

Я нашел эту ссылку http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html это дает метод чтобы рисовать на вашем изображении, однако это не повлияет на оригинал, просто копия, которую вы можете сохранить (), если вам нужно.

в случае, если ссылка идет вниз:

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);

вы не можете создать графику из индексированного формата изображения (PNG, GIF,...). Вы должны использовать растровое изображение (файл или преобразовать изображение в растровое изображение).

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