如何提取UI Image或CG ImageRef的Alpha通道,并将其转换为可与CGImageMaskCreate一起使用的掩码?

例如:

基本上,给出任何图像,我不关心图像中的颜色.我想要的是创建一个表示Alpha通道的灰度图像.然后可以使用该图像来屏蔽其他图像.

当您提供图标图像时,其示例行为在UIBarButtonItem中.根据苹果文档,它表示:

The images displayed on the bar are derived from this image. If this image is too large to fit on the bar,it is scaled to fit. Typically,the size of a toolbar and navigation bar image is 20 x 20 points. The alpha values in the source image are used to create the images—opaque values are ignored.

UIBarButtonItem接受任何图像,只能看到alpha,而不是图像的颜色.

解决方法

要按条形按钮项目的方式来绘制图标,您不需要传统的面具,您想要一个面具的倒数 – 原始图像中的不透明像素占用最终着色,而不是其他方式.

这是完成这个的一种方法.拿你原来的RBGA图像,并通过以下处理:

>将其绘制为仅Alpha通道位图图像
>反转每个像素的alpha值得到与上述相反的行为
>将此倒置的Alpha图像转换为实际的掩码
>使用它

例如.

#define ROUND_UP(N,S) ((((N) + (S) - 1) / (S)) * (S))

// Original RGBA image
CGImageRef originalMaskImage = [[UIImage imageNamed:@"masktest.png"] CGImage];
float width = CGImageGetWidth(originalMaskImage);
float height = CGImageGetHeight(originalMaskImage);

// Make a bitmap context that's only 1 alpha channel
// WARNING: the bytes per row probably needs to be a multiple of 4 
int strideLength = ROUND_UP(width * 1,4);
unsigned char * alphaData = calloc(strideLength * height,sizeof(unsigned char));
CGContextRef alphaOnlyContext = CGBitmapContextCreate(alphaData,width,height,8,strideLength,NULL,kCGImageAlphaOnly);

// Draw the RGBA image into the alpha-only context.
CGContextDrawImage(alphaOnlyContext,CGRectMake(0,height),originalMaskImage);

// Walk the pixels and invert the alpha value. This lets you colorize the opaque shapes in the original image.
// If you want to do a Traditional mask (where the opaque values block) just get rid of these loops.
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        unsigned char val = alphaData[y*strideLength + x];
        val = 255 - val;
        alphaData[y*strideLength + x] = val;
    }
}

CGImageRef alphaMaskImage = CGBitmapContextCreateImage(alphaOnlyContext);
CGContextRelease(alphaOnlyContext);
free(alphaData);

// Make a mask
CGImageRef finalMaskImage = CGImageMaskCreate(CGImageGetWidth(alphaMaskImage),CGImageGetHeight(alphaMaskImage),CGImageGetBitsPerComponent(alphaMaskImage),CGImageGetBitsPerPixel(alphaMaskImage),CGImageGetBytesPerRow(alphaMaskImage),CGImageGetDataProvider(alphaMaskImage),false);
CGImageRelease(alphaMaskImage);

现在,您可以使用finalMaskImage作为CGContextClipToMask等中的掩码等.

ios – 如何将UIImage / CGImageRef的Alpha通道转换为掩码?的更多相关文章

  1. android – 如何将位图的黑色背景颜色更改为透明?

    我正在使用以下代码创建Bitmap:但我想将背景颜色从黑色更改为透明,因为我也希望在另一个Activity中使用此对象.我搜索了很多,但我无法找到解决方案.请帮忙.提前致谢.解决方法当然,在模式ARGB_8888中创建的位图支持透明度但alpha通道最初由0xff填充,因此位图是不透明的.您必须清除整个位图,包括alpha通道,如下所示:

  2. Win32剪贴板和Alpha通道图像

    我特别感兴趣的是找出数据是否必须预付.如上所述,Word2010和XnView不会超前,而Firefox和Chrome.但是,知道颜色通道是否应该预乘,这一点至关重要.非常感谢您的光临!我已经倾销了完整的DIBV5,它与我的应用程序是一样的,但仍然可以与FF和Chrome一起使用,但不适用于我的应用程序,所以还必须有其他的东西!2)InternetExplorer10也是如此.将IE10的Alpha通道图像粘贴到我的应用程序上根本不起作用…我正在获得一个深度为24的DIB,即没有alpha通道所有.然而,

  3. javascript – Canvas:屏蔽图像并保留其alpha通道?

    这是我要做的:>获取图像A和图像B.图像B是黑色和白色的蒙版图像.>用图像B的红色通道替换图像A的Alpha通道.>在画布上绘制图像C.>在图像C的顶部绘制图像A.一切似乎都可以直到第4步.图像C根本不可见,图像A应该是透明的,有白色.解决方法Simon是对的:putimageData方法不注意合成;它只是复制像素值.为了获得合成,我们需要使用绘图操作.我们需要将像素数据的通道(变成红色变成alp

  4. three.js中的alpha通道不一致

    平面物体的例子:问题最明显的挤压样条几何示例:解决方法尝试使用depthTest.通常这会有所帮助:还有许多与您的主题相关的其他问题,例如:transparentbug

  5. OpenCV(c)多通道元素访问

    我正在尝试使用OpenCV的“新”2.0c版本,但其他一切都像是简单的C版本.我在更改图像中的值时遇到了一些问题.图像是CV_8UC3.它不起作用.我究竟做错了什么???解决方法你不应该使用Vec3b代替Vec3i吗?CV_8UC3表示您的图像是8位,3个通道,无符号字符.而Vec3iis为3通道整数而Vec3bis为3通道无符号char.所以我认为你应该使用Vec3b

  6. ios – 删除图像中的Alpha通道

    我有一个应用程序图标的iOS,但苹果不允许alpha的形象.如何清除此Alpha通道?我只有我的png图像我没有源文件,因为我的朋友为我做的图像.解决方法假设您没有其他图像编辑器,那么您可以在Mac上的预览中打开它,并使用导出选项以不同的格式重新保存,以确保您摆脱Alpha通道,最好导出到JPG,然后打开它并将其作为PNG导出.话虽如此,我怀疑你可能会提交透明度通道的图标,只要没有实际的透明度.

  7. ios – 如何将UIImage / CGImageRef的Alpha通道转换为掩码?

    如何提取UIImage或CGImageRef的Alpha通道,并将其转换为可与CGImageMaskCreate一起使用的掩码?

  8. java – 我可以使用libjpeg来读取带Alpha通道的JPEG吗?

    >如果没有,是否有可以使用的替代C库可以处理它们?显而易见,至少有两个其他的解决方案是更普遍的问题:>更改软件以输出普通JPEG代表Alpha通道的PNG文件>以某种方式提高Sun的ImageIO的性能…但第一个将涉及很多代码更改,并不清楚如何去做后者.在任何情况下,我认为如何使用libjpeg加载这样的文件的问题可能是更普遍的兴趣.任何建议将不胜感激.解决方法你有没有试过libjpeg-turbo?它应该能够解码RGBA,并且已经有一个Java包装器.

  9. 如何使用JavaScript将图像从PNG转换为JPEG?

    我试图从画布中获取图像.PNG图像正确到位,但JPEG正在产生问题.我附上图片在这里.第一张图片是我的画布.随着PNG然后JPEG.so我想要我的JPEG图像与白色背景或我需要一个解决方案PNG到JPEG转换在JS解决方法原因这样做的原因是画布是透明的.然而,透明度为黑色的透明Alpha通道,因此它不会显示在屏幕上.另一边的JPEG不支持Alpha通道,因此默认的黑色将被剥去其alpha通道留下黑

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部