`

Getting the pixel data from a CGImage object(Objective-c取得图像的像素信息)

阅读更多

Q: How do I access the pixel data of a CGImage object?

A: On Mac OS X 10.5 or later, a new call has been added that allows you to obtain the actual pixel data from a CGImage object. This call, CGDataProviderCopyData, returns a CFData object that contains the pixel data from the image in question. An example of using this call to obtain pixel data from a CGImage is shown in Listing 1. Once you have the CFData object with your pixel information, you can call CFDataGetBytePtr to get a pointer to the pixel data, or CFDataGetBytes to copy a subrange of pixel data.

Listing 1: Getting raw pixel data from a CGImage.

CFDataRef CopyImagePixels(CGImageRef inImage)
{
    return CGDataProviderCopyData(CGImageGetDataProvider(inImage));
}

  

Note: CopyImagePixels as written will return NULL if the passed in CGImage object is NULL or if the contents of the image are too large to fit in memory.

WARNING: The pixel data returned by CGDataProviderCopyData has not been color matched and is in the format that the image is in, as described by the various CGImageGet functions (see for Getting Information About an Image more information). If you want the image in a different format, or color matched to a specific color space, then you should draw the image to a bitmap context as described later in this Q&A, with the caveat that alpha information from the image will be multiplied into the color components.

Prior to Mac OS X 10.5 an image's pixels are not as readily available. The only way to guarantee access to the equivalent bits is to create a bitmap context with a memory buffer you specify and then draw the CGImage to the context using CGContextDrawImage. After drawing the CGImage to the context you will have a copy of the data in the buffer you specified (which can also be easily accessed using the CGBitmapContexGetData function). The code in Listing 2 demonstrates how to do this.

IMPORTANT: Listing 2 creates a bitmap context with a 8-bits per component ARGB color space, draws the source image to this context, then retrieves the image bits in this color space from the context. Regardless of what the source image format is (CMYK, 24-bit RGB, Grayscale, and so on) it will be converted over to this color space.

For more information about creating bitmap contexts for other pixel formats, see the Quartz 2D Programming Guide.

Listing 2: Accessing the pixel data of a CGImage.

void ManipulateImagePixelData(CGImageRef inImage)
{
    // Create the bitmap context
    CGContextRef cgctx = CreateARGBBitmapContext(inImage);
    if (cgctx == NULL) 
    { 
        // error creating context
        return;
    }

     // Get image width, height. We'll use the entire image.
    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    CGRect rect = {{0,0},{w,h}}; 

    // Draw the image to the bitmap context. Once we draw, the memory 
    // allocated for the context for rendering will then contain the 
    // raw image data in the specified color space.
    CGContextDrawImage(cgctx, rect, inImage); 

    // Now we can get a pointer to the image data associated with the bitmap
    // context.
    void *data = CGBitmapContextGetData (cgctx);
    if (data != NULL)
    {

        // **** You have a pointer to the image data ****

        // **** Do stuff with the data here ****

    }

    // When finished, release the context
    CGContextRelease(cgctx); 
    // Free image data memory for the context
    if (data)
    {
        free(data);
    }

}

CGContextRef CreateARGBBitmapContext (CGImageRef inImage)
{
    CGContextRef    context = NULL;
    CGColorSpaceRef colorSpace;
    void *          bitmapData;
    int             bitmapByteCount;
    int             bitmapBytesPerRow;

     // Get image width, height. We'll use the entire image.
    size_t pixelsWide = CGImageGetWidth(inImage);
    size_t pixelsHigh = CGImageGetHeight(inImage);

    // Declare the number of bytes per row. Each pixel in the bitmap in this
    // example is represented by 4 bytes; 8 bits each of red, green, blue, and
    // alpha.
    bitmapBytesPerRow   = (pixelsWide * 4);
    bitmapByteCount     = (bitmapBytesPerRow * pixelsHigh);

    // Use the generic RGB color space.
    colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
    if (colorSpace == NULL)
    {
        fprintf(stderr, "Error allocating color space\n");
        return NULL;
    }

    // Allocate memory for image data. This is the destination in memory
    // where any drawing to the bitmap context will be rendered.
    bitmapData = malloc( bitmapByteCount );
    if (bitmapData == NULL) 
    {
        fprintf (stderr, "Memory not allocated!");
        CGColorSpaceRelease( colorSpace );
        return NULL;
    }

    // Create the bitmap context. We want pre-multiplied ARGB, 8-bits 
    // per component. Regardless of what the source image format is 
    // (CMYK, Grayscale, and so on) it will be converted over to the format
    // specified here by CGBitmapContextCreate.
    context = CGBitmapContextCreate (bitmapData,
                                    pixelsWide,
                                    pixelsHigh,
                                    8,      // bits per component
                                    bitmapBytesPerRow,
                                    colorSpace,
                                    kCGImageAlphaPremultipliedFirst);
    if (context == NULL)
    {
        free (bitmapData);
        fprintf (stderr, "Context not created!");
    }

    // Make sure and release colorspace before returning
    CGColorSpaceRelease( colorSpace );

    return context;
}

 

原文地址:http://developer.apple.com/library/mac/#qa/qa2007/qa1509.html
分享到:
评论

相关推荐

    Object-c生成Gif动画并且显示

    1. **创建帧数据**:每个帧的数据可以是`CGImage`对象,需要包含图像内容和透明度信息。可以使用`UIImage`的`CGImage`属性获取图像的原始数据。 2. **设置帧延迟时间**:每个帧都有一个对应的延迟时间,表示帧应...

    iOS的Object-C中drawRect:的使用

    在iOS开发中,Objective-C(Object-C)是Apple为其操作系统,包括iOS,提供的一种主要编程语言。`drawRect:`方法是Objective-C中的一个关键概念,主要用于自定义视图(UIView)的绘制工作。当我们需要对视图进行特殊...

    ios+draw+时钟+代码+object-c

    在iOS开发中,Objective-C(OC)是一种常用的编程语言,特别是在构建用户界面时。本教程将深入探讨如何利用OC来创建一个动态时钟应用。在iOS设备上,我们可以通过Core Graphics框架来实现自定义绘图,包括绘制时钟的...

    gif的实现 object-c

    在iOS开发中,动态图像处理是一项常见的需求,而GIF(Graphics Interchange Format)格式由于其支持动画且广泛被浏览器支持,成为了首选的格式之一。本文将深入探讨如何使用Objective-C来实现GIF的生成。 首先,...

    ios 本地根据传入的字符串生成二维码的代码

    在iOS开发中,生成二维码是一项常见的任务,尤其在移动支付、信息分享等方面有着广泛的应用。本文将详细讲解如何使用Objective-C在本地根据传入的字符串生成二维码。 首先,我们需要了解生成二维码的核心技术——...

    TTPMLPPmoon:一个简单的照片编辑器

    Objective-C的Foundation框架提供了UIImage和CGImage等类,用于加载、显示和操作图像。在TTPMLPPmoon中,开发者很可能利用这些类进行图片的读取、显示以及滤镜效果的实现。例如,通过修改CGImage的像素数据,可以...

    ios开发小技巧

    theAlert.layer.contents = (id)[theImage CGImage]; ``` **解析:** - 创建 `UIAlertView` 对象并设置其属性。 - 使用 Core Graphics 绘制自定义背景图像,并将其设置为 AlertView 的背景。 ### 14. 键盘透明 ...

    OC-mp4视频截图,OC-mp4视频截图

    Objective-C是C语言的超集,它添加了Smalltalk风格的消息传递机制,使得开发者能够创建更加灵活和强大的应用程序。在本案例中,"OC-mp4视频截图"的标题和描述可能是指一个使用Objective-C编写的工具或代码片段,用于...

    图片灰度处理

    在iOS开发中,图片灰度处理是一项常见的图像处理技术,它将彩色图像转换为单色图像,即灰度图像。这种处理方式常用于简化视觉效果、优化显示或进行图像分析。本文将深入探讨如何在iOS中实现图片的灰度处理,并提供...

    ios-对图片进行灰度,美白,彩色底板的算法处理.zip

    在iOS开发中,图片处理是一项常见的任务,尤其在设计用户界面或者进行图像编辑应用时。本教程将深入探讨如何对图片进行灰度、美白和彩色底板的算法处理。我们将主要使用Core Graphics框架来实现这些功能,这是一个...

    ImageComparison:收藏-在image图片上获取某点颜色值,比较俩图片的相似性

    Objective-C提供了Core Graphics框架,其中包含`CGContext`和`CGImage`等类,可以用来处理图像。通过`CGImageGetDataProvider`获取图像的数据提供者,然后使用`CGDataProviderCopyData`获取图像数据,最后解析这些...

    更改应用程序的背景

    Swift是苹果在2014年推出的新语言,它语法简洁且安全,而Objective-C则是早期的苹果开发语言,虽然较为复杂,但在许多现有项目中仍然广泛使用。无论选择哪种语言,我们都可以通过UIKit框架来操作用户界面,包括设置...

    SRImageRotator:一个简单的imageRotator

    `SRImageRotator` 是一个基于Objective-C编写的轻量级图像旋转工具。在iOS开发中,处理图片的旋转经常是必要的,例如用户拍摄的照片方向与预览不一致,或者需要在应用内部实现动态的图片展示效果。`SRImageRotator` ...

    生成中间带图片的二维码

    在Objective-C环境中,如果需要调用这个Swift文件,你需要确保项目已经正确设置了桥接头文件(Bridge Header),并在桥接头文件中引入`CreateCodeImageFile.swift`: ```objective-c #import "YourProject-Swift.h...

    iOS图像处理:位图图像原图修改SpookCam

    在iOS开发中,图像处理是一项重要的技术,广泛应用于各种应用程序,包括相机应用、社交媒体滤镜、游戏等。本文将深入探讨如何使用位图图像进行原图修改,特别关注"SpookCam"项目中的方法,该项目可能是一个实现特殊...

    IOS应用源码——简单的滤镜demo.zip

    本示例"简单的滤镜demo"提供了一个基础的iOS应用源码,旨在帮助开发者理解如何在Objective-C或Swift中实现图像滤镜。下面我们将深入探讨这个主题。 首先,我们要了解iOS中处理图像的基本框架Core Image。Core Image...

    ios-字符串生成二维码.zip

    在iOS开发中,将字符串转换为二维码是一种常见的需求,特别是在移动应用中,用户可以通过扫描二维码获取信息或执行特定操作。这个“ios-字符串生成二维码.zip”压缩包提供了一个简单的示例,帮助开发者了解如何实现...

    iOS截屏的几种方法

    // Then make the UIImage from that. UIImage *myImage = [UIImage imageWithCGImage:imageRef]; UIImageWriteToSavedPhotosAlbum(myImage, nil, nil, nil); return myImage; } ``` **关键步骤解析:** 1. *...

    CIFilterExample:macOS Objective C CIFilter 使用

    在本文中,我们将深入探讨如何在macOS平台上利用Objective-C编程语言来操作Core Image框架中的CIFilter。CIFilter是Apple的Core Image框架的一部分,它提供了强大的图像处理能力,可以用于实时图像编辑、视频过滤...

    ios View背景设置

    let a = CGFloat(data.load(fromByteOffset: pixelInfo + 3)) / 255.0 if backgroundColor == nil { backgroundColor = UIColor(red: r, green: g, blue: b, alpha: a) } } } view.backgroundColor = ...

Global site tag (gtag.js) - Google Analytics