4

生成しているビットマップからピクセル値を読み戻すのに問題があります。最初に、次のコードを使用して、クラスでmaskBitmapという名前のビットマップを生成します。

    void generateMaskBitmap()
    {
        if (inputBitmap != null)
        {
            Bitmap tempBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(tempBitmap))
            {
                Brush brush = Brushes.Black;
                for (int y = 0; y < tempBitmap.Height; y += circleSpacing)
                {
                    for (int x = 0; x < tempBitmap.Width; x += circleSpacing)
                    {
                        g.FillEllipse(brush, x, y, circleDiameter, circleDiameter);
                    }
                }
                g.Flush();
            }

            maskBitmap = (Bitmap)tempBitmap.Clone();
        }
    }

次に、次のコードを使用して、元の画像にマスクを適用しようとします。

    void generateOutputBitmap()
    {
        if (inputBitmap != null && maskBitmap != null)
        {
            Bitmap tempBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height);
            for (int y = 0; y < tempBitmap.Height; y++)
            {
                for (int x = 0; x < tempBitmap.Width; x++)
                {
                    Color tempColor = maskBitmap.GetPixel(x, y);

                    if (tempColor == Color.Black)
                    {
                        tempBitmap.SetPixel(x, y, inputBitmap.GetPixel(x, y));
                    }
                    else
                    {
                        tempBitmap.SetPixel(x, y, Color.White);
                    }
                }
            }
            outputBitmap = tempBitmap;
        }
    }

マスクビットマップは正常に生成され、画像ボックスに表示されますが、テスト時のすべてのピクセルの色の値はtempColor空を示します(A = 0、R = 0、G = 0、B = 0)。getpixel / setpixelのパフォーマンスの問題を認識していますが、これはこのプロジェクトの問題ではありません。"tempColor == Color.Black"これは有効なテストではないことも承知していますが、これは私の比較コードの単なるプレースホルダーです。

4

1 に答える 1

2

私はあなたの問題を再現することができません。私はあなたのコードをコピーして貼り付け、それが私のために機能するようにいくつかの変更を加えました。tempColor時々#FF000000であることを確認できます。

どこかでビットマップ参照を混同したのではないかと思います。#00000000以外の値を取得していないことを本当に確信していますか?あなたとは賢明な価値観を持っていますか?そして最も重要なこと:あなたは正しいビットマップから読んでいることを絶対に確信していますか?circleDiametercircleSpacing

これが私のバージョンのコードです。これは機能することがわかっています。

using System;
using System.Drawing;

namespace Test
{
    class Program
    {
        static void Main()
        {
            var bitmap = GenerateMaskBitmap(100, 100);
            TestMaskBitmap(bitmap);
        }

        const int CircleDiameter = 10;
        const int CircleSpacing = 10;

        static Bitmap GenerateMaskBitmap(int width, int height)
        {
            Bitmap maskBitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(maskBitmap))
            {
                Brush brush = Brushes.Black;
                for (int y = 0; y < maskBitmap.Height; y += CircleSpacing)
                {
                    for (int x = 0; x < maskBitmap.Width; x += CircleSpacing)
                    {
                        g.FillEllipse(brush, x, y, CircleDiameter, CircleDiameter);
                    }
                }
                g.Flush();
            }

            return maskBitmap;
        }

        static void TestMaskBitmap(Bitmap maskBitmap)
        {
            for (int y = 0; y < maskBitmap.Height; y++)
            {
                for (int x = 0; x < maskBitmap.Width; x++)
                {
                    Color tempColor = maskBitmap.GetPixel(x, y);

                    if (tempColor.ToArgb() != 0)
                        throw new Exception("It works!");
                }
            }
        }
    }
}
于 2013-02-14T23:59:30.207 に答える