Проблема с изображениями PNG в C # - PullRequest
9 голосов
/ 26 октября 2009

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

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

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

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

newGraphics = Graphics.FromImage(img);

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

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

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

РЕДАКТИРОВАТЬ: посредством отладки Visual Studio сообщает мне, что изображение имеет format8bppindexed формат пикселей.

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

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

EDIT3: мои операторы использования:

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

Ответы [ 2 ]

12 голосов
/ 26 октября 2009

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

Image img = Image.FromFile("file.png");
img = new Bitmap(img);
newGraphics = Graphics.FromImage(img);
10 голосов
/ 26 октября 2009

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

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

редактирование:

Я нашел эту ссылку 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);
...