2009-10-26 15 views
7

Visual Studio 2008で作業しています。PNG画像を描画して再度保存しようとしています。C#でのPNG画像の問題

私は、次の操作を行います。

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

そしてコンストラクタで

:ソリューションの構築

newGraphics = Graphics.FromImage(img); 

にエラーを与えません。私はそれを実行しようとすると、私はこれを取得:

A Graphicsオブジェクトは、インデックス付き ピクセルフォーマットを有する画像から を作成することはできません。

私はC#で画像を使用する経験はあまりありません。これはどういう意味ですか、これをどのように修正できますか?

EDIT:デバッグにより、画像にformat8bppindexedのピクセル形式があることがわかります。

私はGraphicsクラスを使用できない場合はどうすればよいですか?

EDIT2:thisを読んだ後、GDI +で作業するときJPGファイルに固執するのがよいと思いますが、

EDIT3:私は、ステートメントを使用して:

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

この方法では、任意の運? http://www.c-sharpcorner.com/UploadFile/rrraman/graphicsObject08232007102733AM/graphicsObject.aspx – Greg

+0

私は常にGraphicsオブジェクトでPNGファイルを使用しています。使用しているPNGファイルへのリンクを投稿すると、間違っているものが表示されます。 – MusiGenesis

+0

内部的にGDIはビットマップで動作します。JPGは圧縮されており、生データを処理するための圧縮イメージを持っていません。あなたのイメージは8bppIndexedです。これはピクセルデータではなく色がパレットに格納されているビットマップ形式です。 Graphicsオブジェクトはピクセル値を直接変更することはできません。変更されないためです。あなたはそれを24bppRGBに変換する必要があります – badbod99

答えて

9

インデックス付きPNGを使用する必要がない場合は、そのエラーをトラップし、サードパーティのユーティリティを使用して入力を標準RGB PNGに変換することができます。

編集:私はしかし、それは、あなたが必要な場合、あなたが保存できるだけのコピーを()の元には影響しません、あなたのイメージに描画する方法を提供します。このリンク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); 
+0

GDI +は、OPと同じ効果を持つグラフィックスコンテキストの作成をサポートしていません。とにかく、回避策のためのまともなリンクはここにあります: http://fci-h.blogspot.com/2008/02/c-indexed-pixel-problem.html –

+0

そのblogpostはそれをしました。ありがとう。 – KdgDev

12

あなたは、インデックス付き画像形式(PNG、GIF、...)からグラフィックスを作成することはできません。 ビットマップを使用する必要があります(画像をファイルに変換するか、画像をビットマップに変換する必要があります)。あなたは明らかにGDI +グラフィックオブジェクトは、インデックス付きイメージをサポートしていないので、その画像に描画しようとしている運の外出インデックス付きのPNGをサポートして、より良いPNGライブラリなし

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

確かに、そこにはリンクがありません。 – KdgDev

+0

おそらく私は必要な "using"ステートメントを持っていませんが、Visual Studioはその関数を認識しません。 – KdgDev

+0

どちらが機能しますか? – Guillaume