簡體   English   中英

C#裁剪圖像中的透明部分

[英]C# Crop transparent parts in an image


我有這張圖片:

在此處輸入圖像描述

我寫了一個代碼,應該只裁剪帶黑點的部分
(代碼僅適用於 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;
    }

如果您發現為什么當有黑色像素時它無法識別,請告訴我..
不管怎么說,還是要謝謝你 :)

這段代碼有很多問題:

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

當最大值被初始化為最大值時,一個點將如何大於最大值? 這應該是(0,0)

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

我不確定這是否會如您所願。 您有一個 32 位圖像,帶有 alpha 通道,因此您需要考慮 alpha 值。 此外,您正在與預定義的顏色進行比較,該顏色的參考與您的像素不匹配,即使所有 4 個通道都匹配。 您可能只想檢查 alpha 分量是否非零。 如果您只比較顏色通道,請注意透明像素很可能具有匹配的顏色,從而產生意想不到的結果。

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();

這不會保存圖像,你知道嗎? 您保存圖像,在代碼開始時未修改,然后在裁剪后永遠不會重新保存它(我假設這些東西,包括硬編碼的路徑,是用於調試的,但即便如此,您似乎也可能意思是在這里寫圖像)

您正在比較: (check == Color.Black)這意味着:參考check指向與參考Color.Black相同的實例——>這永遠不會是真的。

你必須比較實際的顏色:

(check.ToArgb() == Color.Black.ToArgb())
private Image cropTransparency(Image image)
    {
        Bitmap imageCrop = new Bitmap(image); // aca paso la imagen original a Bitmap
        //imageCrop.Save(@"tmp.png");
        Point min = new Point(imageCrop.Width, imageCrop.Height);
        Point max = new Point(0, 0);
        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.FromArgb(255, 0, 0, 0))
                {
                    Console.WriteLine("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(min.X,min.Y), 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;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM