0

我在 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;
}

我看不出为什么生成的图像这么大=/

有任何想法吗?

干杯,

4

1 回答 1

1

预计会有更大的尺寸。您磁盘上的图像可能被压缩为 jpg,其大小可以根据压缩级别变小(图像压缩过多时会丢失质量)。

当图像存储在矩阵中时,它不会被压缩。这里有一个公式来估计 的大小image

image_size_in_bytes = image_width x image_height x number_of_channels x bit_depth

假设我们有一个 1280 x 960 大小的 RGB 图像。这可能会在 jpeg 格式的磁盘上占用大约 220 KB 的存储空间(它可能或多或少取决于用于存储图像的压缩级别)。当您将图像加载到 UIImage 时,它​​将使用大约 17 倍的内存:

1280 x 960 x 3 x 8 = 3,686,400 Bytes = 3.69 MB  
于 2013-06-09T15:20:07.947 回答