将 UIImage 裁剪为 alpha

2023-11-21

我有一个相当大的、几乎全屏的图像,我将在 iPad 上显示它。图像的透明度约为 80%。我需要在客户端确定不透明像素的边界框,然后裁剪到该边界框。

扫描 StackOverflow 上的其他问题并阅读一些 CoreGraphics 文档,我想我可以通过以下方式完成此任务:

CGBitmapContextCreate(...) // Use this to render the image to a byte array

 ..
   - iterate through this byte array to find the bounding box
 ..

CGImageCreateWithImageInRect(image, boundingRect);

这似乎非常低效且笨拙。我可以用 CGImage 蒙版做一些聪明的事情,或者利用设备的图形加速来做到这一点吗?


感谢用户404709 的辛勤工作。 下面的代码也处理视网膜图像并释放 CFDataRef。

- (UIImage *)trimmedImage {

    CGImageRef inImage = self.CGImage;
    CFDataRef m_DataRef;
    m_DataRef = CGDataProviderCopyData(CGImageGetDataProvider(inImage));

    UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef);

    size_t width = CGImageGetWidth(inImage);
    size_t height = CGImageGetHeight(inImage);

    CGPoint top,left,right,bottom;

    BOOL breakOut = NO;
    for (int x = 0;breakOut==NO && x < width; x++) {
        for (int y = 0; y < height; y++) {
            int loc = x + (y * width);
            loc *= 4;
            if (m_PixelBuf[loc + 3] != 0) {
                left = CGPointMake(x, y);
                breakOut = YES;
                break;
            }
        }
    }

    breakOut = NO;
    for (int y = 0;breakOut==NO && y < height; y++) {

        for (int x = 0; x < width; x++) {

            int loc = x + (y * width);
            loc *= 4;
            if (m_PixelBuf[loc + 3] != 0) {
                top = CGPointMake(x, y);
                breakOut = YES;
                break;
            }

        }
    }

    breakOut = NO;
    for (int y = height-1;breakOut==NO && y >= 0; y--) {

        for (int x = width-1; x >= 0; x--) {

            int loc = x + (y * width);
            loc *= 4;
            if (m_PixelBuf[loc + 3] != 0) {
                bottom = CGPointMake(x, y);
                breakOut = YES;
                break;
            }

        }
    }

    breakOut = NO;
    for (int x = width-1;breakOut==NO && x >= 0; x--) {

        for (int y = height-1; y >= 0; y--) {

            int loc = x + (y * width);
            loc *= 4;
            if (m_PixelBuf[loc + 3] != 0) {
                right = CGPointMake(x, y);
                breakOut = YES;
                break;
            }

        }
    }


    CGFloat scale = self.scale;

    CGRect cropRect = CGRectMake(left.x / scale, top.y/scale, (right.x - left.x)/scale, (bottom.y - top.y) / scale);
    UIGraphicsBeginImageContextWithOptions( cropRect.size,
                                           NO,
                                           scale);
    [self drawAtPoint:CGPointMake(-cropRect.origin.x, -cropRect.origin.y)
           blendMode:kCGBlendModeCopy
               alpha:1.];
    UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    CFRelease(m_DataRef);
    return croppedImage;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 UIImage 裁剪为 alpha 的相关文章

  • 如何从 NSString 中删除十六进制字符

    我面临一个与字符串中的某些十六进制值相关的问题 我需要从字符串中删除十六进制字符 The problem is when i print object it prints as BLANK line And in debug mode it
  • 切换到工作区并在 Xcode 中添加 CocoaPods 后提交 git 吗?

    我刚刚在 Xcode 5 中将 CocoaPods 添加到我当前的项目中 当然 CocoaPods 创建了一个工作区 并且我已在 Xcode 中启动了该工作区 我在工作区中看到了我的项目和 Pods 项目 我的项目从第一天起就处于源代码控制
  • 从 Core Data、iOS 获取最后插入的项目

    有没有办法获取核心数据数据库中最后插入的项目 这将返回最后插入的对象 setFetchLimit 1 和 setFetchOffset 所有条目数 1
  • 为了支持 iPhone 5 的更长屏幕,需要检查什么? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone 5屏幕尺寸如何处理 https stackoverflow com questions 12396545 how to deal with iphone 5 screen size iP
  • 在模拟器中运行应用程序时删除本地通知的 iOS 权限警报

    我正在尝试编写验收测试KIF https github com kif framework KIF在一个很早就要求本地通知权限的应用程序上 不幸的是 由于 iOS 模拟器安全原因无法使用 KIF 自动接受 iOS 权限警报 https gi
  • 打印附加结构(swift 4)

    我有三个 textifled 用于将数据附加到结构中 如何打印我附加的内容 现在我收到一条错误消息 import UIKit class ViewController UIViewController IBOutlet var c UITe
  • Xcode MyProjectName-Bridging-Header.h 不存在

    我想开始在我的 Objective C 项目中使用 Swift 所以我添加了一个快速类 import Foundation objc class System NSObject objc func printSome println Pri
  • 在两个数字之间设置 UILabel 文本动画?

    我是 iPhone 和 Mac 编程新手 之前为 Windows 开发过 我有一个问题 我如何制作动画text的财产UILabel两个数字之间 例如从5 to 80以 Ease Out 风格 是否可以与CoreAnimation 我已经在谷
  • 适用于移动应用程序的 Rails REST API。会议

    我正在创建一个移动应用程序 该应用程序拥有用户并与后端的自定义 Rails REST API 进行通信 我应该在登录时创建会话吗 或者我应该在每个请求中发送用户名和密码 如果会议是可行的方法 那么通常是如何实施的 只需生成令牌 并使用它们来
  • 在 iOS 上的 SceneKit 中导入 3d 模型

    从 URL 导入 obj 文件并将其转换为 SCNNode 时遇到问题 这是代码 swift3 let url URL init string https cloud box com shared static ock9d81kakj91d
  • Expo 应用程序“您的应用程序正在使用广告标识符 (IDFA)”

    我正在尝试将应用程序上传到应用程序商店 每次我上传二进制文件时 苹果都会坚持认为我的应用程序正在使用广告 而我从未实现过这样的事情 我查看了文档并删除了涉及的所有代码ASIdentifier and adIdentifier我不太确定我错过
  • UIWebView 未正确加载 JavaScript - 嵌入式 Facebook 帖子

    Facebook 有一项新功能 允许用户将公共帖子嵌入网页中 我想尝试在 UIWebView 内的 iPhone 应用程序中使用它 转义必要的代码非常简单 但即使我手动转义代码 Web 视图也不会正确加载帖子 JavaScript 根本不起
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • UIWebView 如何检测 被点击

    我知道下面的方法可以检测链接元素点击 但我想知道是否UIView可以检测是否img元素被点击 BOOL webView UIWebView webView shouldStartLoadWithRequest NSURLRequest re
  • 在 swift 中设置状态栏的自定义颜色?

    在视图控制器上 我想将状态栏的颜色设置为黑色 但我无法更改它 我为此目的使用下面的代码 func setUpUI self navigationController setNavigationBarHidden true animated
  • 从 AF.Request 响应获取数据

    我需要使用 Alamofire 的 Post 请求调用的 json 响应中的数据 但由于某种原因我无法访问该数据 我尝试按照 Alamofire github 文档以及这篇文章进行操作从 AF 响应 JSON 获取数据 https stac
  • 实时获取 Apple Watch heartRateVariabilitySDNN 吗?

    我正在使用下面的函数来获取 heartRateVariabilitySDNN 但它只获取一次并且不能像 heartbeat 那样实时计算 func HRVstart guard let quantityType HKObjectType q
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • iOS SDK:MapKit MKPolyLine 未显示

    我试图在地图上显示多段线 但该线没有显示 我尝试了很多事情 但注意到似乎有用 我检查了核心数据函数 它正在返回数据 所以这不是问题 它必须是我在地图点创建或地图上绘制的某个地方 我猜 我确信一定是某个地方出了点小错误 但我找不到它 My c
  • 如何在 iOS 5 中使用 Embed Segue?

    iOS 6 引入了 Embed Segue 允许在 Storyboard 中使用自定义容器控制器 有没有办法在 iOS 5 上复制这个 这里的挑战是子视图控制器的视图通常要添加为父视图控制器的某些容器视图的子视图 因为你不能随机进行序列UI

随机推荐

  • 缓存 AJAX 请求

    我正在向 PHP 应用程序发送 AJAX GET 请求 并希望缓存请求返回以供以后使用 由于我使用 GET 这应该是可能的 因为不同的请求请求不同的 URL 例如 getHTML php page 2 和 getHTML php page
  • numpy 中唯一元素的分组索引

    我有许多大型 gt 100 000 000 整数列表 其中包含许多重复项 我想获取每个元素出现的索引 目前我正在做这样的事情 import numpy as np from collections import defaultdict a
  • iFrame onload JavaScript 事件

    我有一个 iFrame 我想在加载后向其中发送 JavaScript 命令 我当前的代码如下所示 但使用此代码时 命令不会执行 我必须改变什么才能让它发挥作用 仅需要支持 Chrome 和 Firefox 使用 iFrame 的 onloa
  • 为什么 MQTT 无法与 NodeJS 连接?

    我在尝试连接时遇到一个奇怪的问题MQTT服务器与NODEJS 如果我连接到MQTT服务器和我没有连接它只是挂起 如果我使用命令行执行此操作 我会看到数据 因此网络 服务器等都很好 如果我使用错误的端口 那么命令行会给我一条有效的拒绝消息 但
  • 为什么 django-lint 告诉我 `auto_now_add` 已被弃用?

    各位 Djangonauts 朋友们大家好 我检查了我的项目Django lint 它产生 W 211 16 MyModel timestamp Uses superceded auto now or auto now add The 提交
  • 使用 Oracle PL/SQL Developer 生成测试数据

    我想测试一些模式和索引 并且想知道 PL SQL Developer 中是否有可以生成测试数据的功能 这样我就不必创建序列和循环来在表中插入数据 循环和 PL SQL 并不总是必要的 这个技巧可能会有所帮助 insert into emp
  • Discord window.localStorage 未定义。如何访问 Discord 页面上的 localStorage?

    当我跑步时window localStorage on https stackoverflow com它返回localStorage但是当我在 Discord 页面上使用相同的命令时它会返回undefined每次 Discord 是否正在采
  • Phonegap Cordova - 全屏后底部黑色状态栏

    从我记事起我就一直遇到这个问题 我认为这可能只是来自我的手机或仿真 但在发布我的应用程序后 我仍然在屏幕底部看到这个黑色矩形 它看起来像状态栏 在我的 config xml 中有此内容后会发生这种情况
  • 有没有更简单快速的方法来检测(Windows Phone 7)设备是否有互联网连接

    是否有更简单快速的方法来检测 Windows Phone 7 设备是否有互联网连接 我当前正在发送网络请求 等待超时时间并处理异常 希望有一种快速简单的方法来查询设备 在发送任何请求之前查看它是否有连接 提前致谢 如果没有连接 此方法将返回
  • PHP 获取图像高度和宽度

    您好 我需要动态获取上传图像的高度和宽度 这是我正在使用的 PHP 函数 但它不会返回任何宽度和高度 请你帮助我好吗 list width height type attr getimagesize FILES Artwork min wi
  • 实体框架+存储库+单元或工作问题

    我正在考虑使用 EF 4 启动一个新项目并浏览一些文章 我发现了一篇关于 EF 以及存储库模式和工作单元的文章 http blogs msdn com b adonet archive 2009 06 16 using repository
  • 为什么“uniq”将相同的单词视为不同的单词?

    我想计算文件中单词的频率 其中单词是一行一行的 该文件非常大 因此这可能是问题所在 在本例中共有 300k 行 我执行这个命令 cat temp occ uniq c sort k1 1nr k2 gt distribution txt 问
  • Symfony 2:控制器的依赖注入(DI)

    是否有机会使控制器依赖于其服务 而不是通过使用其中的服务容器 而是通过纯粹的构造函数依赖注入 我想用这种方式编写控制器
  • Python lambda函数计算数字的阶乘

    我刚刚开始学习Python 我遇到了 lambda 函数 在其中一个问题上 作者要求编写一个用于数字阶乘的单线性 lambda 函数 这是给出的解决方案 num 5 print lambda b lambda a b a a b lambd
  • bash:如何评估 PS1、PS2……? [复制]

    这个问题在这里已经有答案了 可能的重复 Echo 扩展 PS1 有什么办法可以 评估 吗 PS1 PS2等来自 bash 脚本中的内容 虽然 我可以使用替代方法来获取当前的所有元素PS1 我真的希望能够重用它的定义 而不是使用这些替代方法
  • PyQT QTreeWidget迭代

    我有两列QTreeWidget 一列代表一个网址列表第二个代表results 我已加载第一列中的网址列表 现在我想迭代此列表 并在迭代期间更改第二列中的文本 如何实现这一目标 您可以致电QTreeWidget invisibleRootIt
  • 为什么WebSocket“握手后”可以与HTTP共享80端口?

    我认为 端口指定服务器上的程序 当我们说to share a port 实际上意味着to have the requests processed by the same program listening on that port WebS
  • 如何使用 cygwin/mingw 在 Windows 上编译 PHP 扩展?

    我正在尝试建立RabbitMQ PHP 包装器和AMPQ PHP 包装器在 Windows 64 上使用 Cygwin 我已经成功构建了底层 C 库 librabbitmq dll 但我陷入了 phpize 步骤 phpize config
  • JPA OneToMany - 集合为空

    我正在尝试使用 JPA 建立双向关系 我了解维持双方关系是应用程序的责任 例如 图书馆有多本书 在图书馆实体中我有 Entity public class Library OneToMany mappedBy library cascade
  • 将 UIImage 裁剪为 alpha

    我有一个相当大的 几乎全屏的图像 我将在 iPad 上显示它 图像的透明度约为 80 我需要在客户端确定不透明像素的边界框 然后裁剪到该边界框 扫描 StackOverflow 上的其他问题并阅读一些 CoreGraphics 文档 我想我