[英]NSData -> UIImage -> NSData
我有一個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);
我收到此錯誤: <Error>: CGBitmapContextCreate: invalid data bytes/row: should be at least 324 for 8 integer bits/component, 3 components, kCGImageAlphaNoneSkipFirst.
從NSData到UIImage:
[UIImage imageWithData:]
有關UIImage的更多信息
從UIImage到NSData:
UIImage *img = [UIImage imageNamed:@"some.png"];
NSData *dataObj = UIImageJPEGRepresentation(img, 1.0);
基本程序是使用創建位圖背景CGBitmapContextCreateWithData
然后創建一個CGImageRef
從與CGBitmapContextCreateImage
。 用於創建位圖上下文的參數取決於原始數據在內存中的布局方式。 Quartz並不支持所有類型的原始數據。
CGBitmapContextCreateWithData
的文檔非常詳細,這是最具挑戰性的部分,從上下文中獲取CGImageRef
並將其包裝在UIImage
( imageWithCGImage:
是很簡單的。
錯誤消息指出rowBytes必須至少為324; 將其除以4是81,這意味着“寬度”小於“ w”,並且w = 81。 這兩個值應該匹配。
嘗試用較小的數字(例如5)替換width和w來驗證這一點。 我還要指出,在調用vImageConvert_RGB888toARGB8888之前,您應該通過malloc分配dst.data。
考慮使用CGImageCreate()而不是創建bitmapcontext:
// 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
);
如果您的數據是RGB格式,則需要使用CGBitmapContextCreate
和CGColorSpaceCreateDeviceRGB
並使用kCGImageAlphaNone
創建位圖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.