裁剪区域不是矩形时裁剪图像

Posted

技术标签:

【中文标题】裁剪区域不是矩形时裁剪图像【英文标题】:Crop an image while cropping area is not rectangle 【发布时间】:2016-12-17 18:02:40 【问题描述】:

如果所选区域不是完美的矩形,如何从图像中裁剪特定区域?在这个image中,如何将红色以外的区域裁剪成不同的部分?

【问题讨论】:

图像只能是矩形的。看着图片我不知道你想要什么.. 也许something like this? 我想这取决于你所说的“作物”是什么意思。如果它是 ARGB 图像(带有 alpha/透明度)并且您想要使像素具有某种颜色,例如透明,您可以执行 Bitmap.GetPixel() 并检查您想要隐藏的颜色,然后调整我想该像素的 alpha 值。 帮自己一个忙,读一本关于图像处理基础的书或至少一些教程……可能有帮助的术语:aoi、roi、mask 有趣的问题 - 你有更高分辨率的图片吗? 【参考方案1】:

要隔离图像的非矩形区域和/或基于颜色的区域,一种强大的方法是使用 32 位图像的 alpha/transparency 属性。例如,左边的图像是原始的 24 位图像(无 alpha),右边是将该图像转换为 32 位的结果,并将 alpha = 0 设置为所有白色或红色像素原始图像。实际上,这可以使您的图像非矩形。

此代码相当简单。下面的方法采用输入位图(24 位),生成一个空白的 32 位图像,并将所有像素从源传输到目标,将所有白色或红色像素的 alpha 设置为 0。

public Bitmap ModifyAlpha(Bitmap bmap)
    
        Bitmap bmap32 = new Bitmap(bmap.Width, bmap.Height, PixelFormat.Format32bppArgb);

        Color theColor = new Color();
        Color newColor = new Color();

        for (int i = 0; i < bmap.Width; i++)
        
            for (int j = 0; j < bmap.Height; j++)
            
                // Get the color of the pixel at (i,j)
                theColor = bmap.GetPixel(i, j);

                // Set the pixel color/range you want to make transparent
                if ((theColor.R > 250 && theColor.G > 250 && theColor.B > 250) ||
                    (theColor.R > 250))
                
                    newColor = Color.FromArgb(0, theColor.R, theColor.G, theColor.B);
                    bmap32.SetPixel(i, j, newColor);
                 else
                
                    bmap32.SetPixel(i, j, theColor);
                
            
        
        return bmap32;
     

【讨论】:

以上是关于裁剪区域不是矩形时裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

从 WPF 中的图像裁剪对角线区域

从 WPF 中的图像裁剪对角线区域

在图像 Python 中裁剪自定义区域 [关闭]

找到要裁剪的图像的矩形区域

Android 上的自定义裁剪

如何在 iOS 中裁剪非矩形区域