2016-03-15 65 views

回答

1

可能最快的方法是遍历图像并找到不是黑色的边框像素。然后将图像重新绘制到剪切由边框像素接收的矩形的新上下文中。

通过边界像素我的意思是最左边,最顶部,最底部和最右边。您可以找到一种方法从UIImage中获取原始RGBA缓冲区,然后您可以通过该缓冲区遍历宽度和高度,并在适当时设置边界值。这意味着例如获得leftMostPixel,首先将其设置为某个较大值(或图像宽度),然后在迭代中如果像素不是黑色,并且如果leftMostPixel > x则为leftMostPixel = x

既然您有4个边界值,您可以从中创建一个框架。要重新绘制目标矩形,您可以使用具有上下文的各种工具,但最简单的方法是创建具有边界矩形大小的视图,并将原始图像的大小放在图像视图上并创建视图的屏幕截图。尽管图像视图原点必须是减去有界矩形的原点(我们把它放在屏幕外)。

虽然您可能会遇到一些与图像方向有关的问题。如果图像的方向不同于up,那么原始数据将不会考虑这一点。因此,在创建有界矩形时需要考虑这一点......或者先重新绘制图像以使其正确定向......或者您甚至可以使用RGBA数据创建子缓冲区,并从这些数据创建CGImage并应用与输入一样,输出为UIImage

所以在获得边界后,有很多程序。有些更慢,有些需要更多的内存,有些只是很难编码,并有边缘情况。

+0

谢谢你解释答案马蒂奇。如果你能让我知道可以使用的步骤/函数(或者一些示例项目),例如如何遍历图像,我将不胜感激。即如何获得其像素值?然后如何检查它的像素是黑色的地方等。一些代码片段将是巨大的帮助 –

+0

http://stackoverflow.com/questions/448125/how-to-get-pixel-data-from-a-uiimage- cocoa-touch-or-cgimage-core-graphics应该告诉你如何获取RGBA数据; for循环在你的情况下应该是每个宽度和每个高度,而不是数。如果黑色像素的RGB分量为零,则为rawData [index] == 0,rawData [index + 1] == 0 ... –