J'essaie d'obtenir la longueur d'une UIImage
. Pas la largeur ou la hauteur de l'image, mais la taille des données.
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.
UIImage *img = [UIImage imageNamed:@"sample.png"];
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
NSLog(@"Size of Image(bytes):%d",[imgData length]);
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;
- (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];
}
}
Exemple dans Swift :
let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
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);
Swift 3:
let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
print("Size: \(data.count) bytes")
}
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);
}
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)
}
Où Int64(data.count)
est ce dont vous avez besoin sous forme numérique.