Получить размер UIImage (длина байтов) не высота и ширина
Я пытаюсь получить длину a UIImage
. Не ширина или высота изображения, а размер данных.
9 ответов:
основные данные a
UIImage
может варьироваться, поэтому для одного и того же" изображения " можно иметь различные размеры данных. Одна вещь вы можете сделать, это использоватьUIImagePNGRepresentation
илиUIImageJPEGRepresentation
чтобы получить эквивалентнуюNSData
конструкции для любого, а затем проверить размер этого.
UIImage *img = [UIImage imageNamed:@"sample.png"]; NSData *imgData = UIImageJPEGRepresentation(img, 1.0); NSLog(@"Size of Image(bytes):%d",[imgData length]);
используйте свойство CGImage UIImage. Затем с помощью комбинации CGImageGetBytesPerRow*
CGImageGetHeight, добавить в sizeof 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]; } }
пример Свифт:
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). Вам просто нужно выделить достаточно памяти и передать указатель на первый arg 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") }
при необходимости в удобочитаемой форме мы можем использовать ByteCountFormatter
if let data = UIImageJPEGRepresentation(image, 1.0) { let fileSizeStr = ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: ByteCountFormatter.CountStyle.memory) print(fileSizeStr) }
здесь
Int64(data.count)
это то, что нужно в числовом формате.