首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSData -> UIImage -> NSData

NSData -> UIImage -> NSData
EN

Stack Overflow用户
提问于 2012-03-14 03:39:31
回答 4查看 3.7K关注 0票数 2

我有一个NSData对象,它包含图像的RGB值。我想把它变成一个UIImage (给定宽度和高度)。然后,我想将该UIImage转换回一个与我开始时相同的NSData对象。

请帮帮我,我已经试了好几个小时了。

以下是我看过/尝试过的一些东西,虽然可能不太正确,因为它不起作用:

代码语言:javascript
复制
CGImageCreate
CGBitmapContextCreateWithData
CGBitmapContextGetData
CGDataProviderCopyData(CGImageGetDataProvider(imageRef))

谢谢!

下面是我当前的代码:

代码语言:javascript
复制
NSMutableData *rgb; //made earlier
double len = (double)[rgb length];
len /= 3;
len += 0.5;
len = (int)len;
int diff = len*3-[rgb length];
NSString *str = @"a";
NSData *a = [str dataUsingEncoding:NSUTF8StringEncoding];
for(int i =0; i < diff; i++) {
    [toEncode appendData:a]; //so if my data is RGBRGBR it will turn into RGBRGBR(97)(97)
}
size_t width = (size_t)len;
size_t height = 1;
CGContextRef ctx; 
CFDataRef m_DataRef;
m_DataRef = (__bridge CFDataRef)toEncode;
UInt8 * m_PixelBuf = (UInt8 *) CFDataGetBytePtr(m_DataRef); 
vImage_Buffer src;
src.data = m_PixelBuf;
src.width = width;
src.height = height;
src.rowBytes = 3 * width;
vImage_Buffer dst;
dst.width = width;
dst.height = height;
dst.rowBytes = 4 * width;
vImageConvert_RGB888toARGB8888(&src, NULL, 0, &dst, NO, kvImageNoFlags);
//    free(m_PixelBuf);
//    m_PixelBuf = dst.data;
//    NSUInteger lenB = len * (4/3);
/*
 UInt8 * m_Pixel = malloc(sizeof(UInt8) * lenB);
 int z = 0;
 for(int i = 0; i < lenB; i++) {
 if(i % 4==0) {
 m_Pixel[i] = 0;
 } else {
 m_Pixel[i] = m_PixelBuf[z];
 z++;            
 }
 }*/
//    Byte tmpByte; 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
/*
 ctx = CGBitmapContextCreate(m_PixelBuf, 
 width, 
 height, 
 8, 
 4*width, 
 colorSpace, 
 kCGImageAlphaPremultipliedFirst ); 
 */
size_t w = (size_t)len;
ctx = CGBitmapContextCreate(dst.data, 
                            w, 
                            height, 
                            8, 
                            4*width, 
                            colorSpace, 
                            kCGImageAlphaNoneSkipFirst );     
CGImageRef imageRef = CGBitmapContextCreateImage (ctx); 
UIImage* rawImage = [UIImage imageWithCGImage:imageRef]; 

CGContextRelease(ctx); 

我得到这个错误:<Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 324 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipFirst.

EN

回答 4

Stack Overflow用户

发布于 2012-03-14 03:45:49

从NSData执行UIImage操作:

代码语言:javascript
复制
[UIImage imageWithData:]

有关UIImage的更多信息

从UIImage执行NSData操作:

代码语言:javascript
复制
UIImage *img = [UIImage imageNamed:@"some.png"];
NSData *dataObj = UIImageJPEGRepresentation(img, 1.0);

有关UIImageJPEGRepresentation()的更多信息

票数 5
EN

Stack Overflow用户

发布于 2012-03-14 03:56:02

基本步骤是使用CGBitmapContextCreateWithData创建一个位图上下文,然后使用CGBitmapContextCreateImage从该上下文创建一个CGImageRef。用于创建位图上下文的参数取决于原始数据在内存中的布局方式。并非所有类型的原始数据都受Quartz支持。

documentation on CGBitmapContextCreateWithData非常详细,这是最具挑战性的部分,从上下文中获取CGImageRef并将其包装在UIImage (imageWithCGImage:)中是很容易的。

票数 2
EN

Stack Overflow用户

发布于 2012-03-14 04:44:09

如果数据为RGB格式,则需要使用CGBitmapContextCreateCGColorSpaceCreateDeviceRGB以及kCGImageAlphaNone来创建位图。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9690861

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档