当前位置: 首页 > 编程语言 > C#

自动裁剪位图到最小尺寸?Share

时间:2023-04-10 21:56:16 C#

自动修剪位图到最小尺寸?假设我在32bppARGB模式下有一个System.Drawing.Bitmap。这是一个很大的位图,但它主要是完全透明的像素,中间某处有一个相对较小的图像。什么是检测“真实”图像边界的快速算法,以便我可以裁剪掉所有周围的透明像素?或者,我可以使用.Net的功能吗?基本思想是检查图像的每个像素以找到图像的上、左、右和下边界。要有效地执行此操作,请不要使用GetPixel方法,它非常慢。请改用LockBits。这是我建议的实现:staticBitmapTrimBitmap(Bitmapsource){RectanglesrcRect=default(Rectangle);位图数据数据=空;尝试{data=source.LockBits(newRectangle(0,0,source.Width,source.Height),ImageLockMode.ReadOnly,PixelFormat.Format32bppArgb);byte[]buffer=newbyte[data.Height*data.Stride];Marshal.Copy(data.Scan0,??buffer,0,buffer.Length);整数xMin=整数。最大值;intxMax=0;intyMin=int.MaxValue;intyMax=0;对于(inty=0;yxMax)xMax=x;如果(yyMax)yMax=y;}}}if(xMax它可能被优化了,但我不是GDI+专家,所以没有进一步的研究,这是我能做的最好的......编辑:实际上,有一个简单的方法来优化它:向左扫描到向右直到找到不透明像素;将(x,y)存储到(xMin,yMin)从上到下扫描直到找到不透明像素(仅在x>=xMin时有效);将y存储在yMin中并从右到左扫描直到找到不透明像素(只适用于y>=yMin);将x存入xMax,从下往上扫描,直到找到不透明像素(只适用于xMinEDIT2:this是上面方法的实现:staticBitmapTrimBitmap(Bitmapsource){RectanglesrcRect=default(Rectangle);BitmapDatadata=null;try{data=source.LockBits(newRectangle(0,0,source.Width,source.Height),ImageLockMode.ReadOnly,PixelFormat.Format32bppArgb);byte[]buffer=newbyte[data.Height*data.Stride];Marshal.Copy(data.Scan0,??buffer,0,buffer.Length);intxMin=int.MaxValue,xMax=int.MinValue,yMin=int.MaxValue,yMax=int.MinValue;boolfoundPixel=false;//找到xMinfor(intx=0;x=xMin;x--){boolstop=false;for(inty=yMin;y=yMin;y--){boolstop=false;for(intx=xMin;x如果非透明部分当然很小,不会有明显的增益,因为它仍然会扫描大部分像素,但如果它很大,只需扫描非透明部分周围的矩形部分。我建议分而治之的方法:有用的,需要多了解C#学习教程,希望大家多多关注---splittheimageinmiddle(例如,vertically)检查是否有是切割线上的非透明像素(如果是,请记住最小值/最大值)如果切割线包含非透明像素,则再次垂直拆分左半部分->更新边界框,如果不是,则可以丢弃最左边的一半(我不'知道图片)继续左半边和右半边(你说图像在中间的某个地方),直到找到图像的最左边界并对右半边做同样的事情