CodeV

3.7-从字节数据创建图像

清单 3-7 演示了字节到图像的场景,从您提供的字节生成图像。因此,将这些字节传递给CGBitmapContextCreate()作为第一个参数。这告诉Quartz不要分配内存,而是使用您提供的数据作为新上下文的初始内容。

除了这个小小的变化,代码清单 3-7 中的代码现在应该看起来很熟悉。它从上下文创建一个图像,将CGImageRef转换为UIImage,并返回该新的图像实例。

能够在两个方向上转换数据:从图像到数据,从数据到图像。意味着您可以将图像处理集成到绘图例程中,并在UIView中使用结果。

清单 3-7 将字节转换为图像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
UIImage *ImageFromBytes(NSData *data, CGSize targetSize)
{
// Check data
int width = targetSize.width;
int height = targetSize.height;
if (data.length < (width * height * 4))
{
NSLog(@"Error: Got %d bytes. Expected %d bytes",data.length, width * height * 4);
return nil;
}

// Create a color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
NSLog(@"Error creating RGB colorspace");
return nil;
}

// Create the bitmap context
Byte *bytes = (Byte *) data.bytes;
CGContextRef context = CGBitmapContextCreate(
bytes, width, height,
BITS_PER_COMPONENT, // 8 bits per component
width * ARGB_COUNT, // 4 bytes in ARGB
colorSpace,
(CGBitmapInfo) kCGImageAlphaPremultipliedFirst);
CGColorSpaceRelease(colorSpace );
if (context == NULL)
{
NSLog(@"Error. Could not create context");
return nil;
}

// Convert to image
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage *image = [UIImage imageWithCGImage:imageRef];

// Clean up
CGContextRelease(context);
CFRelease(imageRef);

return image;
}

本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。