获取UIImage的大小(字节长度)而不是高度和宽度
我试图得到一个UIImage
的长度。 不是图像的宽度或高度,而是数据的大小。
UIImage
的底层数据可能会有所不同,因此对于相同的“映像”,可以使用不同大小的数据。 你可以做的一件事是使用UIImagePNGRepresentation
或UIImageJPEGRepresentation
获取等价的NSData
构造,然后检查其大小。
UIImage *img = [UIImage imageNamed:@"sample.png"]; NSData *imgData = UIImageJPEGRepresentation(img, 1.0); NSLog(@"Size of Image(bytes):%d",[imgData length]);
使用UIImage的CGImage属性。 然后使用CGImageGetBytesPerRow *
CGImageGetHeight,添加的UIImage的大小,你应该在实际大小的几个字节。
这将返回图像的大小,未压缩,如果你想用于像malloc准备位图操作(假设一个4字节的像素格式,3个字节的RGB和1的阿尔法):
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;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)editInfo { UIImage *image=[editInfo valueForKey:UIImagePickerControllerOriginalImage]; NSURL *imageURL=[editInfo valueForKey:UIImagePickerControllerReferenceURL]; __block long long realSize; ALAssetsLibraryAssetForURLResultBlock resultBlock=^(ALAsset *asset) { ALAssetRepresentation *representation=[asset defaultRepresentation]; realSize=[representation size]; }; ALAssetsLibraryAccessFailureBlock failureBlock=^(NSError *error) { NSLog(@"%@", [error localizedDescription]); }; if(imageURL) { ALAssetsLibrary *assetsLibrary=[[[ALAssetsLibrary alloc] init] autorelease]; [assetsLibrary assetForURL:imageURL resultBlock:resultBlock failureBlock:failureBlock]; } }
Swift中的示例:
let img: UIImage? = UIImage(named: "yolo.png") let imgData: NSData = UIImageJPEGRepresentation(img, 0) println("Size of Image: \(imgData.length) bytes")
我不确定你的情况。 如果你需要实际的字节大小,我不认为你这样做。 您可以使用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);
以下是获得答案的最快,最清洁,最一般,最不容易出错的方法。 在UIImage+MemorySize
类别中:
#import <objc/runtime.h> - (size_t) memorySize { CGImageRef image = self.CGImage; size_t instanceSize = class_getInstanceSize(self.class); size_t pixmapSize = CGImageGetHeight(image) * CGImageGetBytesPerRow(image); size_t totalSize = instanceSize + pixmapSize; return totalSize; }
或者如果你只想要实际的位图而不是UIImage实例容器,那么它确实如此简单:
- (size_t) memorySize { return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage); }
Swift 3:
let image = UIImage(named: "example.jpg") if let data = UIImageJPEGRepresentation(image, 1.0) { print("Size: \(data.count) bytes") }