- PR -

画像を256できれいに保存

1
投稿者投稿内容
しんのすけ
会議室デビュー日: 2006/06/21
投稿数: 6
投稿日時: 2006-07-03 19:55
画像を読み込んで加工して保存したいのですが、
画像が汚くなってしまうので、何かアドバイスがあれば
教えてください。

画像形式はGIFです。
元の画像の時はきれいな画像です。
以下のようにして、画像に文字を書いて保存すると
元の画像が荒くなってしまします。

コード:
Image img = new Bitmap(100, 50);

// 背景画像の読込と描画
Bitmap bmap = new Bitmap(baseFilename);
Graphics gr = Graphics.FromImage(img);
         
//文字列の描画
Font fnt = new Font("Arial", 10);
Brush brush = Brushes.Black;
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.LineAlignment = StringAlignment.Center;
gr.DrawString("書込む文字列", fnt, brush, gr.VisibleClipBounds, sf);

//リソースを開放する
bmap.Dispose();
fnt.Dispose();
gr.Dispose();

// 保存
img.Save(saveFilename, ImageFormat.Gif);



また、ペイントを使って以下のことを確認しました。
・24ビットBMPで保存→GIFで保存→荒くなる。
・24ビットBMPで保存→256色BMPで保存→きれいなまま。
・24ビットBMPで保存→GIFで保存→きれいなまま。
もともとの画像もGIFですし、GIFできれいなまま保存できると
思うのですが、うまくいきません。

元の画像を先に256色BMPにしておいてから上記のコードを実行しても
だめでした。

GIFがだめなら256色のBMPでもいいのですが(24ビットは使えない)
何かうまく行く方法か、うまくいかない理由があれば教えてください。

よろしくお願いします。

開発環境は、VS2005 C# です。
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-07-03 21:58
引用:

しんのすけさんの書き込み (2006-07-03 19:55) より:

・24ビットBMPで保存→GIFで保存→荒くなる。
・24ビットBMPで保存→256色BMPで保存→きれいなまま。
・24ビットBMPで保存→GIFで保存→きれいなまま。



2つの処理の違いは何ですか?

解決策ではないのですが、荒くなる理由は、Windows標準のペイントでは、Windows固定の256色で保存されるためだそうです。
http://www.animegif.net/animegif/makegif.html

#憶測ですが、プログラムで保存した場合も同じ理由ではないでしょうか?
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2006-07-04 01:14
こんばんは。

imgは画面色形式に依存したデータになっていると思われます。(おそらく24bpp)
したがって、パレット情報が設定された状態でGIF保存されていません。

明示的に8bppIndexedを指定すればよいのですが、
しかしながら、8bppIndexedな画像からはGraphicsオブジェクトは生成できません。

そこで、
#文字加工が要件だとしてですが・・・。

1. 一旦8bpp画像を読み込む。
2. 24bit画像上(32bitなどbmpからGraphicsが作れれば任意の色形式で良いですが・・・)で画像描画、文字描画などの処理を行う。
3. 1で読み込んだ8bppのIndexed画像からColorPaletteオブジェクトをPaletteプロパティによって取得する。
4. 2で生成した画像をColorPaletteオブジェクトのEntryを使用して、ColorをIndex値に変換しながら、1で読み込んだ画像に対して、LockBitsなどのピクセルデータに対するアクセス方法によって、Index値をピクセル単位で設定。
(もしくは単にSetPixelで色の再設定。・・・とても遅いですが)

以上のように明示的にパレットを使用するように、保存させる必要があります。

加えて、もし加工画像上でアンチエイリアスをかけてしまい、元のパレットエントリに無い色が出現した場合は、(綺麗に減色させたい場合は)自前で減色処理を書く必要があります。
しんのすけ
会議室デビュー日: 2006/06/21
投稿数: 6
投稿日時: 2006-07-05 22:25
深山さんsiaさんありがとうございます。
引用:

・24ビットBMPで保存→GIFで保存→きれいなまま。
2つの処理の違いは何ですか?


すいません、・256色BMPで保存→GIFで保存→きれいなまま。
でした。

siaさんの教えてくれた方法は、私の今の知識ではよくわかりませんでした。
わかるように勉強しようとも思ったのですが、
深山さんの話からすると、Windows固定の256色で元の画像を作成すればよさそうなので
荒くなった後の画像にある色を使って元の画像を作成しなおすことで
とりあえず、うまくいきました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)