0


私はこの画像を持っています:

ここに画像の説明を入力してください

そして、ドットの周りの透明なピクセルをすべて含まずに、黒いドットのある部分のみをトリミングし
(コードは1色の画像のみ用に作成されています)、 トリミング後に画像を返すことを想定したコードを作成し ました。何らかの理由で、黒のピクセルに到達すると、 これが黒のピクセルであることを認識せず、 そのため、「if」ステートメントをスキップします。




コードは次のとおりです。

    private Image cropTransparency(Image image)
    {
        Bitmap imageCrop = new Bitmap(image);
        imageCrop.Save(@"C:\Users\Nehoray\Desktop\Test.png");
        Point min = new Point(imageCrop.Width, imageCrop.Height);
        Point max = new Point(imageCrop.Width, imageCrop.Height);
        for (int w = 0; w < imageCrop.Width; w++)
        {
            //'w' stands for Width
            for (int h = 0; h < imageCrop.Height; h++)
            {
                //'h' stands for Height
                Color check = imageCrop.GetPixel(w, h);
                if (check == Color.Black)
                {
                    MessageBox.Show("Found a white pixel!");
                    if (w < min.X)
                    {
                        min.X = w;
                    }
                    if (h < min.Y)
                    {
                        min.Y = h;
                    }
                    if (w > max.X)
                    {
                        max.X = w;
                    }
                    if (h > max.Y)
                    {
                        max.Y = h;
                    }
                }
            }
        }
        imageCrop = new Bitmap(max.X - min.X, max.Y - min.Y);
        Graphics g = Graphics.FromImage(imageCrop);
        Rectangle cropRect = new Rectangle(new Point(0, 0), new Size(max.X - min.X, max.Y - min.Y));
        g.DrawImage(image, new Rectangle(0, 0, max.X - min.X, max.Y - min.Y), cropRect, GraphicsUnit.Pixel);
        g.Save();
        return imageCrop;
    }

黒いピクセルがあるときにそれが認識されない理由を見つけたら、私に知らせてください..
とにかくありがとう:)

4

2 に答える 2

2

このコードにはいくつかの問題があります。

    Point max = new Point(imageCrop.Width, imageCrop.Height);

最大値が最大値に初期化されている場合、どのようにしてポイントが最大値よりも大きくなるでしょうか? これは(0,0)

Color check = imageCrop.GetPixel(w, h);
if (check == Color.Black)

これがあなたが思っていることをするかどうかはわかりません。アルファ チャネルを持つ 32 ビット イメージがあるため、アルファ値を考慮する必要があります。また、4 つのチャネルすべてが一致していても、ピクセルと一致しない参照を持つ定義済みの色と比較しています。アルファ成分がゼロでないことを確認したいだけかもしれません。カラー チャネルのみを比較する場合は、透明なピクセルの色が一致する可能性があり、予期しない結果が生じることに注意してください。

Rectangle cropRect = new Rectangle(new Point(0, 0), new Size(max.X - min.X, max.Y - min.Y));

なぜあなたはから切り取ってい0,0ますか?あなたの長方形はで始まる必要がありますmin.X, min.Y

g.Save();

これは画像を保存しません。コードの開始時に変更されていない画像を保存し、トリミングしたら再保存しないでください(ハードコードされたパスを含むこのようなものはデバッグ用であると想定していますが、それでもおそらくここに画像を書くことを意味します)

于 2013-01-19T11:55:19.410 に答える
0

比較し(check == Color.Black)ています: つまり、参照checkと同じインスタンスを指している参照ですColor.Black--> これは決して真ではありません。

実際の色を比較する必要があります。

(check.ToArgb() == Color.Black.ToArgb())
于 2013-01-19T11:58:12.677 に答える