web-dev-qa-db-fra.com

Obtenir la taille d'un UIImage (longueur en octets)

J'essaie d'obtenir la longueur d'une UIImage. Pas la largeur ou la hauteur de l'image, mais la taille des données.

52
Kevin

Les données sous-jacentes d'une UIImage peuvent varier. Ainsi, pour une même "image", on peut avoir différentes tailles de données. Une chose que vous pouvez faire est d'utiliser UIImagePNGRepresentation ou UIImageJPEGRepresentation pour obtenir les constructions NSData équivalentes pour l'une ou l'autre, puis vérifiez la taille de celle-ci.

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

Utilisez la propriété CGImage de UIImage. Ensuite, en utilisant une combinaison de CGImageGetBytesPerRow *
CGImageGetHeight, ajoutez la taille de UIImage, vous devez vous trouver à quelques octets de la taille réelle. 

Cela retournera la taille de l'image, non compressée, si vous souhaitez l'utiliser à des fins telles que malloc en préparation de la manipulation de bitmap (en supposant un format de pixel sur 4 octets de 3 octets pour RGB et 1 pour 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;
17
mahboudz
- (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];
   }
}
12
Darkngs

Exemple dans Swift :

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

Je ne suis pas sûr de votre situation. Si vous avez besoin de la taille en octets réelle, je ne pense pas que vous fassiez cela. Vous pouvez utiliser UIImagePNGRepresentation ou UIImageJPEGRepresentation pour obtenir un objet NSData de données compressées de l'image. 

Je pense que vous voulez obtenir la taille réelle d'une image non compressée (données en pixels). Vous devez convertir UIImage * ou CGImageRef en données brutes. Voici un exemple de conversion de UIImage en IplImage (à partir de OpenCV). Vous devez juste allouer suffisamment de mémoire et passer le pointeur au premier argument 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);
1
Mike Chen

Swift 3:

let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
    print("Size: \(data.count) bytes")
}
1
chengsam

Voici le moyen le plus rapide, le plus propre, le plus général et le moins sujet aux erreurs pour obtenir la réponse. Dans une catégorie 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;
}

Ou si vous ne voulez que le bitmap réel et non le conteneur d'instance UIImage, alors c'est aussi simple que cela:

- (size_t) memorySize
{
  return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}
1
Todd Lehman

Si nécessaire sous une forme lisible par l'homme, nous pouvons utiliser 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) est ce dont vous avez besoin sous forme numérique.

0
TheTiger