Pergunta

Trabalhando no Visual Studio 2008. Estou tentando desenhar uma imagem PNG e salvar essa imagem novamente.

Eu faço o seguinte:

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

E no construtor:

newGraphics = Graphics.FromImage(img);

Construir a solução não dá erros. Quando tento executá -lo, entendo isso:

Um objeto gráfico não pode ser criado a partir de uma imagem que possui um formato de pixel indexado.

Não tenho muita experiência em usar imagens em C#. O que isso significa e como posso remediar isso?

Editar: Através da depuração, o Visual Studio me diz que a imagem tem um format8bppindexed Formato de pixel.

Então, se eu não posso usar a classe gráfica, o que eu uso?

Edit2: depois de ler isto, Acho que é seguro supor que seja melhor manter os arquivos JPG ao trabalhar com GDI+, não?

Edit3: My Using-Statements:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
Foi útil?

Solução

Sem uma biblioteca PNG melhor que suporta PNGs indexados, você está sem sorte tentando desenhar para essa imagem, pois evidentemente o objeto GDI+ Graphics não suporta imagens indexadas.

Se você não precisar usar PNGs indexados, poderá prender esse erro e converter sua entrada em PNGs RGB regulares usando um utilitário de terceiros.

editar:

Eu encontrei este link http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html Isso fornece um método para desenhar sua imagem, no entanto, ela não afetará o original, apenas uma cópia que você pode salvar (), se precisar.

Caso o link caia:

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

Outras dicas

Você não pode criar um gráfico a partir de um formato de imagem indexado (PNG, GIF, ...). Você deve usar um bitmap (arquivo ou converter sua imagem em um bitmap).

Image img = Image.FromFile("file.png");
img = new Bitmap(img);
newGraphics = Graphics.FromImage(img);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top