UIImage`の長さを取得しようとしています。画像の幅や高さではなく、データの大きさです。
UIImageのCGImageプロパティを使用します。 そして、CGImageGetBytesPerRow * と CGImageGetHeight の組み合わせを使って、UIImage のサイズを足せば、実際のサイズは数バイト以内に収まるはずです。 CGImageGetHeightの組み合わせで、UIImageのsizeを追加すれば、実際のサイズから数バイト以内に収まるはずです。
これは、ビットマップ操作の準備のためにmallocなどの目的で使用したい場合、圧縮されていない画像のサイズを返します(RGBに3バイト、アルファに1バイトの4バイトピクセルフォーマットを仮定しています)。
int height = image.size.height,
width = image.size.width;
int bytesPerRow = 4*width;
if (bytesPerRow % 16)
bytesPerRow = ((bytesPerRow / 16) + 1) * 16;
int dataSize = height*bytesPerRow;
あなたの状況がよくわからないのですが。もし、実際のバイトサイズが必要なら、そのようなことはしないと思います。UIImagePNGRepresentationやUIImageJPEGRepresentationを使って、画像の圧縮データのNSDataオブジェクトを取得することができます。
圧縮されていない画像の実サイズ(ピクセルデータ)を取得したいのだと思います。UIImage*またはCGImageRefを生データに変換する必要があります。これはUIImageをIplImageに変換する例です(OpenCVより)。十分なメモリを確保し,CGBitmapContextCreate'の最初の引数にそのポインタを渡せばよいだけです.
UIImage *image = //Your image
CGImageRef imageRef = image.CGImage;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
IplImage *iplimage = cvCreateImage(cvSize(image.size.width, image.size.height), IPL_DEPTH_8U, 4);
CGContextRef contextRef = CGBitmapContextCreate(iplimage->imageData, iplimage->width, iplimage->height,
iplimage->depth, iplimage->widthStep,
colorSpace, kCGImageAlphaPremultipliedLast|kCGBitmapByteOrderDefault);
CGContextDrawImage(contextRef, CGRectMake(0, 0, image.size.width, image.size.height), imageRef);
CGContextRelease(contextRef);
CGColorSpaceRelease(colorSpace);
IplImage *ret = cvCreateImage(cvGetSize(iplimage), IPL_DEPTH_8U, 3);
cvCvtColor(iplimage, ret, CV_RGBA2BGR);
cvReleaseImage(&iplimage);