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

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

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

画像の描画時に変色を防ぐ方法

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■88188 / inTopicNo.1)  画像の描画時に変色を防ぐ方法
  
□投稿者/ マッチ (1回)-(2018/08/08(Wed) 23:42:06)

分類:[C#] 

C#を使ってテンプレートマッチングの練習をしております。
2つの同じ画像を比較しようとして下のようなソースを書いたのですが、
原型の色と異なるようでfalseが返ってきます。
おそらくDrawImageメソッドを使うことによって、元の画像から変色してしまっているからだと思います。
原形のまま変色せずに他のBitmapへコピーすることはできるのでしょうか。

         public void CheckImage()
         {
            Bitmap bitmapIcon = SystemIcons.Hand.ToBitmap();
            Bitmap bitmapBig = new Bitmap(bitmapIcon.Width * 2, bitmapIcon.Height * 2);
            Graphics graphics = Graphics.FromImage(bitmapBig);
            graphics.DrawImage(bitmapIcon, 0,0);
            MessageBox.Show(IsEqualBitmap(bitmapBig, SystemIcons.Hand.ToBitmap(), 0,0).ToString());
        }

        public bool IsEqualBitmap(Bitmap bitmapTarget, Bitmap bitmapImage, int nTargetX, int nTargetY)
        {
            if((nTargetX + bitmapTarget.Width) > bitmapImage.Width)
            {
                return false;
            }

            if((nTargetY + bitmapTarget.Height) > bitmapImage.Height)
            {
                return false;
            }

            for (int nY = 0; nY < bitmapTarget.Height; nY++)
            {
                for (int nX = 0; nX < bitmapTarget.Width; nX++)
                {
                    Color colorTarget = bitmapTarget.GetPixel(nX, nY);
                    Color colorImage = bitmapImage.GetPixel(nTargetX + nX, nTargetY + nY);

                    if (colorTarget != colorImage)
                    {
                        return false;
                    }
                }
            }

            return true;
        }

引用返信 編集キー/
■88189 / inTopicNo.2)  Re[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 を渡すコンストラクタを使うとか。
引用返信 編集キー/
■88224 / inTopicNo.3)  Re[2]: 画像の描画時に変色を防ぐ方法
□投稿者/ マッチ (2回)-(2018/08/09(Thu) 22:58:34)
回答ありがとうございます。

>CompositingMode.SourceCopy にしておけば同じ色になると思ってたのですが、確かに何故か変色しますね。
>拡大・縮小しているわけでも無いですし、今のところ CompositingMode や PixelOffsetMode も効果が見えず。

まさか変形をしているわけではないのに変色するとは思いませんでした。
後でわかったことですが、一度PictureBox.Imageに入れただけでも変色してしまうようです。まいりました。
結局BitmapDataを作成してScan0プロパティを通じてバイト操作をしてデータをコピーすることでなんとか対応しました。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ