UIImage のサイズ(バイト長)を取得する(高さ,幅を除く).

UIImage`の長さを取得しようとしています。画像の幅や高さではなく、データの大きさです。

ソリューション

UIImageの基礎となるデータはさまざまで、同じ "image" でもデータのサイズはさまざまです。UIImagePNGRepresentationUIImageJPEGRepresentation を使用して、同等の NSData 構造体を取得し、そのサイズをチェックすることができます。

解説 (2)

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;
解説 (1)

あなたの状況がよくわからないのですが。もし、実際のバイトサイズが必要なら、そのようなことはしないと思います。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);
解説 (0)