首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从UIImage(Cocoa Touch)或CGImage(Core Graphics)获取像素数据?

要从UIImage(Cocoa Touch)或CGImage(Core Graphics)获取像素数据,可以通过以下步骤实现:

  1. 首先,创建一个CGContextRef上下文,以便在其中绘制CGImage。
  2. 然后,使用CGContextDrawImage方法将CGImage绘制到上下文中。
  3. 接下来,使用CGBitmapContextGetData方法获取上下文中的像素数据。
  4. 最后,处理像素数据以获取所需的信息。

以下是一个简单的示例代码:

代码语言:swift
复制
func getPixelDataFromUIImage(image: UIImage) -> UnsafeMutableRawPointer? {
    guard let cgImage = image.cgImage else {
        return nil
    }
    
    let width = Int(image.size.width)
    let height = Int(image.size.height)
    let bytesPerPixel = 4
    let bytesPerRow = width * bytesPerPixel
    let bitsPerComponent = 8
    
    let context = CGContext(data: nil,
                            width: width,
                            height: height,
                            bitsPerComponent: bitsPerComponent,
                            bytesPerRow: bytesPerRow,
                            space: CGColorSpaceCreateDeviceRGB(),
                            bitmapInfo: CGImageAlphaInfo.premultipliedLast.rawValue)
    
    guard let contextNonNull = context else {
        return nil
    }
    
    contextNonNull.draw(cgImage, in: CGRect(x: 0, y: 0, width: width, height: height))
    
    guard let pixelData = contextNonNull.data else {
        return nil
    }
    
    return pixelData
}

这个函数将返回一个UnsafeMutableRawPointer,指向包含像素数据的缓冲区。您可以使用这个指针来访问和处理像素数据。

请注意,这个示例代码仅适用于RGBA图像。如果您的图像具有不同的颜色格式,您可能需要修改代码以正确处理它们。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图层树和寄宿图 -- iOS Core Animation 系列一

在iOS中,所有的视图都是UIView这个基类派生出来的。UIView可以处理触摸时间,支持Core Graphics绘图,可以仿射变换等等操作。...UIImage有一个CGImage属性,它返回一个CGImageRef,但是这个值不能直接赋值给CALayer的contents,因为CGImageRef不是一个真正的Cocoa对象,而是Core Foundation...Core Foundation和Cocoa对象是不兼容的,可以通过bridged转换: layer.contents = (__bridge id)image.CGImage; 2.1.1 示例...如图所示,图片会变的有点大,而且有像素的颗粒感。因为CGImageUIImage不一样,它没有拉伸的感念。用UIImage读取图片时,读取了高质量的Retina图片。...2.2 Custom Drawing 除了给contents赋值CGImage来设置寄宿图之外,还可以直接用Core Graphics来绘制寄宿图。

1.2K20
  • CALayer的寄宿图

    但是如果你在iOS中试图将UIImage类型的对象赋值给它,那么你将得到一片空白。 事实上,你真正要赋值的类型是CGImageRef,它是一个指向CGImage结构的指针。...UIImage有一个CGImage属性,它返回一个“CGImageRef”,如下: @property(nullable, nonatomic,readonly) CGImageRef CGImage;...- (nullable CGImageRef)CGImage; 如果你想把这个值直接赋值给contents,那么你将得到一个编译错误,因为CGImageRef并不是一个真正的cocoa对象,而是CoreFoundation...像素——物理像素坐标并不会用于屏幕布局,但是仍然与图片有相对关系。UIImage是一个屏幕分辨率解决方案,所以它是用点来度量大小。...contentsRect的默认值是{0,0,1,1},它表示的是,寄宿图像素尺寸的原点(0,0)开始,分别截取宽、高的1倍长度,其实就是展示整个寄宿图。

    1K20

    Swift3.1动画之Core Image

    前言:Core Image是一个强大的框架,可让您轻松地将过滤器应用于图像。您可以获得各种各样的效果,如修改活力,色调曝光。...它可以使用CPUGPU来处理图像数据,并且速度非常快 - 足以实现视频帧的实时处理! 核心图像滤镜也可以链接在一起,以一次将多个效果应用于图像视频帧。多个滤波器被组合成应用于图像的单个滤波器。...这与Core GraphicsOpenGL上下文有些相似。 CIImage。该类保存图像数据。它可以UIImage图像文件像素数据创建。 CIFilter。...接下来,您使用UIImage(cgImage:)构造函数从新创建的CGImage创建UIImage,而不是像以前一样直接CIImage创建。...一旦你改变了这个值,你需要重复几个步骤: 1、CIFilter获取输出CIImage。 2、将CIImage转换为CGImage

    1.5K80

    iOS动画-CALayer基础知识

    、CGColorRef两种数据类型是定义在Core Graphics框架中; QuartzCore框架和CoreGraphics框架可以跨平台使用,在iOS和Mac OS上都能使用 ,但是UIKit却只能在...在Mac OS系统上,contents属性对于CGIamge和NSImage类型的值都起作用;而对于iOS平台,虽然UIImageCGImage属性也返回一个CGImageRef,但如果将这个值直接赋值给...这是因为CGImageRef并不是一个真正的Cocoa对象,而是一个Core Foundation类型; 具体解决方法就是使用bridged关键字,下面是用于演示的代码: - (void)viewDidLoad...*headerImage = [UIImage imageNamed:@"header"]; colorView.layer.contents = (__bridge id)headerImage.CGImage...的值并不是唯一设置寄宿图的方法,我们也可以直接使用Core Graphics直接绘制寄宿图,即通过继承UIView并实现-drawRect:的方式。

    1.9K50

    iOS界面渲染流程分析

    比如控制器数据库中获取数据,或者视图 从一个nib文件中加载,或者涉及IO的图片显示,都会比CPU正常操作慢得多。...Core Graphics绘制 如果对视图实现了drawRect:drawLayer:inContext:方法,或者 CALayerDelegate 的 方法,那么在绘制任何东 西之前都会产生一个巨大的性能开销...当你重写-drawInContext方法时,Core Animation会请求分配一个纹理,同时确保Core Graphics会将你在-drawInContext中绘制的东西放入到纹理的位图数据中。...文件数据磁盘读入内存。 压缩的图像数据被解码成其未压缩的位图形式 Core Animation使用未压缩的位图数据来渲染图层。...最后使用imageWithCGImage()方法将CGImage转化为UIImage

    2.6K20

    CALayer 实用属性补充

    可是CGImageRef属于Core Foundation类型,所以,赋值的时候,需要进行桥接转换。...示例1:  -(void\)viewDidLoad { [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@"demoImage"...类型,它和UIView的contentMode一样,目的是为了处理内容在图层的边界内如何对齐。...kCAGravityResizeAspectFill  contentsScale 这个属性是浮点类型,默认值为1.0,它定义了像素尺寸和视图大小的比例(类似于分辨率,UIView相似功能的属性是contentScaleFactor...当我们使用UIImage时,会获取高质量的图片,但CGImage没有拉伸概念,因此使用CGImage设置图片时,拉伸的因素会在转换的时候丢失,当用代码设置contents图片时,要手动设置图层的contentsScale

    93530

    iOS性能优化——图片加载和处理

    当其显示在屏幕上时,需要UIImage作为数据源。 UIImage持有的数据是未解码的压缩数据,能节省较多的内存和加快存储。...当UIImage被赋值给UIImage时(例如imageView.image = image;),图像数据会被解码,变成RGB的颜色数据。...我们加载jpeg的图片,然后进行相关设置,解码后根据设置生成CGImage缩略图,最后包装成UIImage,最终传递给UIImageView渲染。...return UIImage(cgImage: downsampledImage) } 我的理解:正常的UIImage加载是APP本地读取,或者网络下载图片,此时不涉及图片内容相关的操作,并不需要解码...,所以当UIImage赋值给UIImageView时,CALayer可以直接使用CGImage所持有的图像数据

    2.4K30

    iOS性能优化——图片加载和处理

    当其显示在屏幕上时,需要UIImage作为数据源。 UIImage持有的数据是未解码的压缩数据,能节省较多的内存和加快存储。...当UIImage被赋值给UIImage时(例如imageView.image = image;),图像数据会被解码,变成RGB的颜色数据。...如下图所示: 我们加载jpeg的图片,然后进行相关设置,解码后根据设置生成CGImage缩略图,最后包装成UIImage,最终传递给UIImageView渲染。...return UIImage(cgImage: downsampledImage) } 我的理解:正常的UIImage加载是APP本地读取,或者网络下载图片,此时不涉及图片内容相关的操作,并不需要解码...,所以当UIImage赋值给UIImageView时,CALayer可以直接使用CGImage所持有的图像数据

    2.1K170

    【IOS开发高级系列】异步绘制专题

    CGDataProviderRefsource, const CGFloat decode[], boolshouldInterpolate, CGColorRenderingIntent intent) 通过PNG数据获取图像...引用-1 bool CGImageIsMask(CGImageRefimage) 返回是否为Mask图层 size_t CGImageGetWidth(CGImageRefimage) 获取宽度像素...size_t CGImageGetHeight(CGImageRefimage) 获取高度像素 下面这些方法分别获取相应属性 size_t CGImageGetBitsPerComponent(CGImageRefimage...* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有...11KB多,大大压缩了图片的数据量 ,而且视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景

    1.4K20

    OpenGL ES 2.0 (iOS):基础纹理

    (sampler2D s, vec2 texCoord); 所以剩下的问题就是如何得到 sampler2D 数据,并如何像素数据写入到 Shader 中 Texture_CubeMap: #version...之后 OpenGL 才会分配; (2)进入 setTextureWithProgram: texture: texMode:方法 先准备像素数据【pixelsDatas ImageDatas】:...;】 【MipMapping 发挥作用的地方就是在缩小的时候,OpenGL 会自动选择合适大小的像素数据】 如果纹理像素在 x、y 方向上是做同一个动作【拉伸压缩】,则需要放大缩小像素;如果纹理像素在...本来它不属于 OpenGL 的内容,但是它本身也是图像处理的技术,包括 Core Image、 Accelerate等图像处理的框架,如果可以,请尽量去了解去掌握去熟练。...(cgContext, 1.0, -1.0); // Draw the loaded image into the Core Graphics context // resizing

    2K43
    领券