Problema com imagens PNG em C#
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;
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);