Iphone NSData->;UIImage->;操作文件数据

Iphone NSData->;UIImage->;操作文件数据,iphone,objective-c,image,graphics,sdk,Iphone,Objective C,Image,Graphics,Sdk,我有一个NSData对象,它包含图像的RGB值。我想把它变成一个UIImage(给定宽度和高度)。然后我想将UIImage转换回一个与我开始使用的对象相同的NSData对象 请帮帮我,我已经试了好几个小时了 以下是我看过/尝试过的一些东西,但可能不太正确,因为它们不起作用: CGImageCreate CGBitmapContextCreateWithData CGBitmapContextGetData CGDataProviderCopyData(CGImageGetDataProvider

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

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

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

CGImageCreate
CGBitmapContextCreateWithData
CGBitmapContextGetData
CGDataProviderCopyData(CGImageGetDataProvider(imageRef))
谢谢

这是我目前的代码:

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); 
NSMutableData*rgb//早做
双透镜=(双)[rgb长度];
len/=3;
len+=0.5;
len=(int)len;
int diff=len*3-[rgb长度];
NSString*str=@“a”;
NSData*a=[str dataUsingEncoding:NSUTF8StringEncoding];
对于(int i=0;i

我收到以下错误:
:CGBitmapContextCreate:无效的数据字节/行:对于8个整数位/组件、3个组件、kCGImageAlphaNoneSkipFirst,应至少为324。
从NSData到UIImage:

[UIImage imageWithData:]
更多关于

要从UIImage中删除数据,请执行以下操作:

UIImage *img = [UIImage imageNamed:@"some.png"];
NSData *dataObj = UIImageJPEGRepresentation(img, 1.0);

有关

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


非常详细,这是最具挑战性的部分,从上下文中获取
cgimagerf
,然后将其包装到
UIImage
imageWithCGImage:
)中是很简单的,您将希望使用
CGBitmapContextCreate
CGColorSpaceCreateDeviceRGB
创建位图,并使用
kGimageAlphanone
错误说明行字节至少需要324;除以4等于81,这意味着“宽度”小于“w”,并且w=81。这两个值应该匹配

尝试用一个小数字(如5)替换宽度和w以验证这一点。我还要注意,在调用vImageConvert_RGB888到RGB8888之前,您应该通过malloc分配dst.data

考虑使用CGImageCreate()而不是创建位图上下文:

// this will automatically free() dst.data when destData is dealloc
NSData *destData = [NSData dataWithBytesNoCopy:dst.data length:4*width*height];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)destData);
CGImageRef imageRef = CGImageCreate(width,
                                    height,
                                    8,                          //bits per component
                                    8*4,                        //bits per pixel
                                    4*width,                    //bytesPerRow
                                    colorSpace,                 //colorspace
                                    kCGImageAlphaNoneSkipFirst,
                                    provider,                   //CGDataProviderRef
                                    NULL,                       //decode
                                    false,                      //should interpolate
                                    kCGRenderingIntentDefault   //intent
                                    );

更详细地描述您的输入
NSData
格式。向我们展示您尝试过的实际代码,而不是模糊地描述它。格式只是:R,G,B,R,G,B,R,G,B。。。。。。例如,我想用nsdata对象中存储的:100*100*3字节创建一个100px x x 100px的图像。你还需要编辑你的问题并粘贴到你的实际代码中。这只适用于已经采用某种标准(很可能是压缩的)图像格式(png、jpg…)的数据,但不适用于原始像素数据。我可以将CGBitmapContextCreate用于3通道图像吗?我的数据是RGB格式的,而不是RGBA格式的。实际上,我如何才能有效地将空的alpha通道添加到我的数据中?例如,如果我的数据当前为:R,G,B,R,G,B,R,G,B将其转换为0,R,G,B,B,0,R,G,BY,您可以使用Accelerate框架中的
vImageConvert\u rgb888 to argb888
函数创建包含alpha通道的图像数据副本。不能使用
CGBitmapContextCreate
创建RGB格式(每像素24位)上下文。iOS仅支持32位/像素上下文和8位/像素上下文。我尝试过,我得到了CGBitmapContextCreate:不支持的参数组合:8个整数位/组件;24位/像素;三分量颜色空间;KCGIMAGEALPHONE;啊对。然后使用with alpha创建位图,但只需跳过alpha的设置/读取值?现在我正在尝试@rob mayoff建议在加速框架中使用vImageConvert_RGB888到RGB8888函数