wake-up-neo.com

Liefert die Größe eines UIImage (Bytes Länge) und nicht Höhe und Breite

Ich versuche, die Länge einer UIImage zu ermitteln. Nicht die Breite oder Höhe des Bildes, sondern die Größe der Daten.

52
Kevin

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.

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

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

Beispiel in Swift :

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

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);
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

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);
}
1
Todd Lehman

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.

0
TheTiger