読者です 読者をやめる 読者になる 読者になる

あらかじめ日記

2chまとめサイト「ソノウソホント?」の雑記と、ブログで使えるスクリプトとかテクニックとか。その他、音楽やアニメ、漫画の話題とかも。

まとめサイト「ソノウソホント?」と「ムードもりあげ楽団」はこちら。

【C#】アニメGIFのコピーについて(BitmapクラスのCloneに注意)

プログラミング


こちらの記事で書いたツールの延長です。

allthewayfrom.hatenablog.com
扱う画像タイプにはGIFも利用可能でしたが、アニメGIFを扱うときにきちんとアニメーションしてくれない、、 その対策の備忘録です。


まず、そもそもアニメGIFを読み込ませてもアニメーションしてくれず、PictureBoxが対応していないのかと思いきや調べても問題なく表示できるとの事。
と言うことでソースを見ていて、怪しそうなメソッドBitmap.Clone()、これを外すと上手く表示できたので、どうやらCloneでは完全にコピーしてくれない模様で、1フレーム目の画像だけで終わってしまっているようです。

表示はできるようになったものの、画像編集前のデータは保持しておきたかったので、どうしてもコピーは必要・・・
色々試行錯誤している時に、ふとこのツールはURLを指定して読むことも出来るようにしているのですが、WebClientからバイトデータを読み込んでMemoryStreamに書き込んで作成したBitmapでも、普通にアニメーションしていることに気づきました。

と言うことはつまり、逆にBitmapバイトデータ化し、そのデータをコピーして再度Bitmapを作成すればよいのでは、、と言うことで、結論から言えばこの方法で上手くいきました。

以下サンプルです。

public Bitmap CopyBitmap(Bitmap srcBitmap)
{
	byte[] srcBytes;
	byte[] copyBytes;

	using (MemoryStream memStream = new MemoryStream()) {
		ImageFormat imgFmt = srcBitmap.RawFormat;

		// 対象のBitmapをメモリストリームに書き出し
		srcBitmap.Save(memStream, imgFmt);

		// メモリストリームをバイトデータ化しコピー
		srcBytes = memStream.ToArray();
		copyBytes = new byte[srcBytes.Length];
		srcBytes.CopyTo(copyBytes, 0);
	}

	// コピーしたデータでBitmapを作成
	MemoryStream copyStream = new MemoryStream(copyBytes);
	return new Bitmap(copyStream);
}


ご参考までに。
不適切な箇所があればご指摘お願いします。