Obtener el tamaño de un UIImage (longitud de bytes) no de alto y ancho

Estoy tratando de obtener la longitud de un UIImage . No es el ancho o alto de la imagen, sino el tamaño de los datos.

Los datos subyacentes de un UIImage pueden variar, por lo que para la misma “imagen” uno puede tener diferentes tamaños de datos. Una cosa que puede hacer es usar UIImagePNGRepresentation o UIImageJPEGRepresentation para obtener las construcciones de NSData equivalentes para cualquiera, luego verifique el tamaño de eso.

  UIImage *img = [UIImage imageNamed:@"sample.png"]; NSData *imgData = UIImageJPEGRepresentation(img, 1.0); NSLog(@"Size of Image(bytes):%d",[imgData length]); 

Use la propiedad CGImage de UIImage. Luego, usando una combinación de CGImageGetBytesPerRow *
CGImageGetHeight, agrega el tamaño de UIImage, deberías estar dentro de unos pocos bytes del tamaño real.

Esto devolverá el tamaño de la imagen, sin comprimir, si desea utilizarla para propósitos como malloc en preparación para la manipulación del bitmap (suponiendo un formato de píxel de 4 bytes de 3 bytes para RGB y 1 para Alpha):

 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]; } } 

Ejemplo en Swift :

 let img: UIImage? = UIImage(named: "yolo.png") let imgData: NSData = UIImageJPEGRepresentation(img, 0) println("Size of Image: \(imgData.length) bytes") 

No estoy seguro de tu situación. Si necesitas el tamaño de byte real, no creo que hagas eso. Puede usar UIImagePNGRepresentation o UIImageJPEGRepresentation para obtener un objeto NSData de datos comprimidos de la imagen.

Creo que desea obtener el tamaño real de la imagen sin comprimir (datos de píxeles). Necesita convertir UIImage * o CGImageRef en datos brutos. Este es un ejemplo de conversión de UIImage a IplImage (de OpenCV). Solo necesita asignar suficiente memoria y pasar el puntero al primer arg de 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); 

Esta siguiente es la manera más rápida, más limpia, más general y menos propensa a errores para obtener la respuesta. En una categoría UIImage+MemorySize :

 #import  - (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; } 

O si solo quiere el bitmap real y no el contenedor de instancia de UIImage, entonces es realmente tan simple como esto:

 - (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") } 

Si es necesario en forma legible para humanos, podemos usar ByteCountFormatter

 if let data = UIImageJPEGRepresentation(image, 1.0) { let fileSizeStr = ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: ByteCountFormatter.CountStyle.memory) print(fileSizeStr) } 

Donde Int64(data.count) es lo que necesita en formato numérico.