Ich versuche, die Länge einer UIImage
zu ermitteln. Nicht die Breite oder Höhe des Bildes, sondern die Größe der Daten.
Die zugrunde liegenden Daten einer UIImage
können variieren, sodass für dasselbe "Bild" unterschiedliche Datengrößen möglich sind. Sie können UIImagePNGRepresentation
oder UIImageJPEGRepresentation
verwenden, um die entsprechenden NSData
-Konstrukte für beide zu erhalten. Überprüfen Sie dann die Größe.
UIImage *img = [UIImage imageNamed:@"sample.png"];
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
NSLog(@"Size of Image(bytes):%d",[imgData length]);
Verwenden Sie die CGImage-Eigenschaft von UIImage. Verwenden Sie dann eine Kombination aus CGImageGetBytesPerRow *
CGImageGetHeight, fügen Sie in der Größe von UIImage hinzu, Sie sollten sich innerhalb weniger Bytes der tatsächlichen Größe befinden.
Dies gibt die Größe des Bildes unkomprimiert zurück, wenn Sie es zur Vorbereitung der Bitmap-Manipulation (z. B. malloc) verwenden möchten (vorausgesetzt, ein 4-Byte-Pixelformat von 3 Byte für RGB und 1 für 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];
}
}
Beispiel in Swift :
let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
Ich bin mir nicht sicher, in welcher Situation Sie sind. Wenn Sie die tatsächliche Byte-Größe benötigen, glaube ich nicht, dass Sie das tun. Sie können UIImagePNGRepresentation oder UIImageJPEGRepresentation verwenden, um ein NSData-Objekt mit komprimierten Daten des Abbilds abzurufen.
Ich denke, Sie möchten die tatsächliche Größe eines unkomprimierten Bildes (Pixeldaten) ermitteln. Sie müssen UIImage * oder CGImageRef in Rohdaten konvertieren. Dies ist ein Beispiel für die Konvertierung von UIImage in IplImage (von OpenCV). Sie müssen nur genügend Speicherplatz zuweisen und den Zeiger an CGBitmapContextCreates erstes Argument übergeben.
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")
}
Dies ist der schnellste, sauberste, allgemeinste und am wenigsten fehleranfällige Weg, um die Antwort zu erhalten. In einer Kategorie 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;
}
Oder wenn Sie nur die tatsächliche Bitmap und nicht den UIImage-Instanzcontainer möchten, ist dies wirklich so einfach:
- (size_t) memorySize
{
return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}
Bei Bedarf in lesbarer Form können wir ByteCountFormatter verwenden.
if let data = UIImageJPEGRepresentation(image, 1.0) {
let fileSizeStr = ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: ByteCountFormatter.CountStyle.memory)
print(fileSizeStr)
}
Wo ist Int64(data.count)
was Sie im numerischen Format benötigen.