C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■88189 / 1階層)  画像の描画時に変色を防ぐ方法
□投稿者/ 魔界の仮面弁士 (1774回)-(2018/08/09(Thu) 02:37:54)
No88188 (マッチ さん) に返信
> 2つの同じ画像を比較しようとして下のようなソースを書いたのですが、
CheckImage メソッドで、Dispose が悉く漏れているようですし、
SystemIcons.Hand.ToBitmap() が 2 回呼び出されているのも気になりますが、
それらは本題では無いので、ひとまず横に置いといて…。


> 原型の色と異なるようでfalseが返ってきます。
bitmapImage(= SystemIcons.Hand.ToBitmap())が 64x64 の画像だとしたら、
bitmapTarget(= bitmapBig) は 128x128 になるわけですよね。

ということは、
> if ((nTargetX + bitmapTarget.Width) > bitmapImage.Width)
> {
>  return false;
> }
が意味するのは、
 if ((0 + 128) > 64)
 {
  return false;
 }
になるので、そもそも色の比較まで到達しないような…。


まぁそれを抜きにして、仮に同じサイズだとしても、
 Bitmap bitmapIcon = SystemIcons.Hand.ToBitmap();
 Bitmap bitmapBig = new Bitmap(bitmapIcon));
 MessageBox.Show(IsEqualBitmap(bitmapBig, bitmapIcon, 0, 0).ToString());
においてさえ、何故か GetPixel が微妙に異なる色となりますね。
大半の画素は同一色なのですが。

http://www.vb-user.net/junk/replySamples/2018.08.09.02.31/DrawImage.png


> おそらくDrawImageメソッドを使うことによって、元の画像から変色してしまっているからだと思います。
CompositingMode.SourceCopy にしておけば同じ色になると思ってたのですが、確かに何故か変色しますね。
拡大・縮小しているわけでも無いですし、今のところ CompositingMode や PixelOffsetMode も効果が見えず。


> 原形のまま変色せずに他のBitmapへコピーすることはできるのでしょうか。

一応、Bitmap(Stream) コンストラクタによる複製なら、同一色になるようです。
あとは Scan0 を渡すコンストラクタを使うとか。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←画像の描画時に変色を防ぐ方法 /マッチ →Re[2]: 画像の描画時に変色を防ぐ方法 /マッチ
 
上記関連ツリー

画像の描画時に変色を防ぐ方法 / マッチ (18/08/08(Wed) 23:42) #88188
画像の描画時に変色を防ぐ方法 / 魔界の仮面弁士 (18/08/09(Thu) 02:37) #88189 ←Now
  └ Re[2]: 画像の描画時に変色を防ぐ方法 / マッチ (18/08/09(Thu) 22:58) #88224 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信