У меня есть некоторые проблемы с доступом к изображениям с камеры (или даже к изображениям из фотальбома).
После изменения размера UIImage
(я протестировал несколько разных методов изменения размера, все они приводят к одной и той же ошибке) Я хочучтобы получить доступ к каждому отдельному пикселю для передачи сложному алгоритму.
Проблема заключается в том, что часто существует значение bytesPerRow, которое не соответствует размеру изображения (например, ширина * 4) при доступе к необработанным данным пикселя с помощью CGImageGetDataProvider
->, что приводит к EXC_BAD_ACCESS
ошибка.
Возможно, у нас есть ошибка iOS…
Тем не менее, вот код:
// UIImage capturedImage from Camera
CGImageRef capturedImageRef = capturedImage.CGImage;
// getting bits per component from capturedImage
size_t bitsPerComponentOfCapturedImage = CGImageGetBitsPerComponent(capturedImageRef);
CGImageAlphaInfo alphaInfoOfCapturedImage = CGImageGetAlphaInfo(capturedImageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
// calculate new size from interface data.
// with respect to aspect ratio
// ...
// newWidth = XYZ;
// newHeight = XYZ;
CGContextRef context = CGBitmapContextCreate(NULL, newWidth, newHeight, bitsPerComponentOfCapturedImage,0 , colorSpace, alphaInfoOfCapturedImage);
// I also tried to make use getBytesPerRow for CGBitmapContextCreate resulting in the same error
// if image was rotated
if(capturedImage.imageOrientation == UIImageOrientationRight) {
CGContextRotateCTM(context, -M_PI_2);
CGContextTranslateCTM(context, -newHeight, 0.0f);
}
// draw on new context with new size
CGContextDrawImage(context, CGRectMake(0, 0, newWidth, newHeight), capturedImage.CGImage);
CGImageRef scaledImage=CGBitmapContextCreateImage(context);
// release
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
theImage = [UIImage imageWithCGImage: scaledImage];
CGImageRelease(scaledImage);
После этого я хочу получить доступ к масштабированному изображению с помощью
CGImageRef imageRef = theImage.CGImage;
NSData *data = (NSData *) CGDataProviderCopyData(CGImageGetDataProvider(imageRef));
unsigned char *pixels = (unsigned char *)[data bytes];
// create a new image from the modified pixel data
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);
NSLog(@"bytesPerRow: %f ", (float)bytesPerRow);
NSLog(@"Image width: %f ", (float)width);
NSLog(@"Image height: %f ", (float)height);
// manipulate the individual pixels
for(int i = 0; i < [data length]; i += 4) {
// accessing (float) pixels[i];
// accessing (float) pixels[i+1];
// accessing (float) pixels[i+2];
}
Так, например, когда я получаю доступ к изображению с 511x768 пикселей и масштабирую его до 290x436, я получаю следующий вывод:
Ширина изображения: 290.000000
Высота изображения: 436.000000
битPerComponent: 8.000000
битPerPixel: 32.000000
bytesPerRow: 1184.000000
, и вы можете четко видеть, что bytesPerRow (хотя и выбирается автоматически какао) не соответствует изображению width
.
Я хотел бы видеть любую помощь
Использование iOS
SDK 4.3
на Xcode 4