检测和删除 NSImage 周围透明空间的快速方法

发布于 2024-11-14 18:54:58 字数 290 浏览 3 评论 0原文

修剪图像(NSImage 或 CGImageRef)以便删除图像周围的所有透明区域的最快方法是什么?

我想我可以从顶部开始查看每个像素并确定其 alpha 值,但也许还有另一种(更快)的方法。

谢谢,马克。

PS:我的用例:

我使用 QLThumbnailImageCreate 来生成文件的缩略图。问题是该调用返回的所有图像都具有相同的宽度和高度。

例如,如果我为尺寸为 300x500 的照片创建缩略图,则生成的预览将具有相同的宽度和高度,并在顶部和底部添加透明区域以保留纵横比。

What is the fastest way to trim an image (NSImage or CGImageRef) so that all transparent areas around the image are removed?

I'd imagine I could look at each pixel starting from the top and determine its alpha value, but maybe there's another (faster) way.

Thanks, Mark.

PS: My usecase:

I'm using QLThumbnailImageCreate to generate thumbnails of files. The problem is that all images returned by that call are of equal width and height.

For example, if I create a thumbnail for a photo of the dimensions 300x500, the resulting preview would be of the same width and height with transparent areas added at the top and bottom to preserve the aspect ratio.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

不必你懂 2024-11-21 18:54:58

如果您只获得指向原始像素数据的指针,那么迭代图像中的像素实际上非常快。即使在 iOS 设备上,这也相当快。

使用 CGImageRef ,您将获得如下所示的像素数据:

CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(anImage)); 
const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);

并且您可以迭代它:

for (int j = 0; j < (anImageHeight * anImageWidth); j++)
{
    if (pixels[j] & 0xff000000)
    {
    //this is not a transparent pixel
    }
}

It's actually really fast to iterate over the pixels in an image if you just get a pointer to the raw pixel data. Even on iOS devices this is pretty quick.

Using a CGImageRef you'd get the pixel data like this:

CFDataRef imageData = CGDataProviderCopyData(CGImageGetDataProvider(anImage)); 
const UInt32 *pixels = (const UInt32*)CFDataGetBytePtr(imageData);

and you can just iterate through it:

for (int j = 0; j < (anImageHeight * anImageWidth); j++)
{
    if (pixels[j] & 0xff000000)
    {
    //this is not a transparent pixel
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文