我在iPhone上检查我的OpenCV应用程序的分配,并发现相机拍摄的照片大约需要300kb,应用程序转换的照片需要6 MB(大20倍)。
不是很奇怪吗?看看我用来从cvMat转换UIImage的函数:+ (UIImage *)UIImageFromCVMat:(const cv::Mat&)cvMat withOrientation:(UIImageOrientation) orientation{
NSData *data = [NSData dataWithBytes:cvMat.data length:cvMat.elemSize() * cvMat.total()];
CGColorSpaceRef colorSpace;
if (cvMat.elemSize() == 1) {
colorSpace = CGColorSpaceCreateDeviceGray();
} else {
colorSpace = CGColorSpaceCreateDeviceRGB();
}
CGDataProviderRef provider = CGDataProviderCreateWithCFData((__bridge CFDataRef)data);
CGImageRef imageRef = CGImageCreate(cvMat.cols, // Width
cvMat.rows, // Height
8, // Bits per component - ok
8 * cvMat.elemSize(), // Bits per pixel - ok
cvMat.step[0], // Bytes per row - ok
colorSpace, // Colorspace - ok
kCGImageAlphaNone | kCGBitmapByteOrderDefault, // Bitmap info flags
provider, // CGDataProviderRef
NULL, // Decode
false, // Should interpolate
kCGRenderingIntentDefault); // Intent
UIImage *image = [[UIImage alloc] initWithCGImage:imageRef scale:1.0 orientation:orientation];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
return image;
}
我看不出为什么生成的图像太大= /
有什么想法吗?
干杯,
答案 0 :(得分:1)
预计会有更大的尺寸。磁盘上的图像可能压缩为jpg,其大小可以根据压缩级别变小(图像压缩过多时质量会丢失)。
当图像存储在矩阵中时,它不会被压缩。这是估算image
:
image_size_in_bytes = image_width x image_height x number_of_channels x bit_depth
假设我们有一个RGB图像,大小为1280 x 960。这可以以jpeg格式在磁盘上占用大约220 KB的存储空间(它可以或多或少取决于用于存储映像的压缩级别)。当您将图像加载到UIImage时,它将使用大约17倍的内存:
1280 x 960 x 3 x 8 = 3,686,400 Bytes = 3.69 MB