web-dev-qa-db-ja.com

高さと幅ではなくUIImageのサイズ(バイト長)を取得します

UIImageの長さを取得しようとしています。画像の幅や高さではなく、データのサイズ。

55
Kevin

UIImageの基礎となるデータは異なる可能性があるため、同じ「イメージ」に対して、さまざまなサイズのデータ​​を持つことができます。できることの1つは、UIImagePNGRepresentationまたはUIImageJPEGRepresentationを使用して、いずれかの同等のNSDataコンストラクトを取得し、そのサイズを確認することです。

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

UIImageのCGImageプロパティを使用します。次に、CGImageGetBytesPerRowの組み合わせを使用します*
CGImageGetHeight、sizeof UIImageを追加すると、実際のサイズの数バイト以内になります。

これは、ビットマップ操作の準備でmallocなどの目的で使用する場合、圧縮されていない画像のサイズを返します(RGBの場合は3バイト、Alphaの場合は1の4バイトピクセル形式を想定)。

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

Swiftの例:

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

以下は、最も速く、最もクリーンで、最も一般的で、エラーが発生しにくい回答を得る方法です。カテゴリ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;
}

または、UIImageインスタンスコンテナではなく、実際のビットマップのみが必要な場合は、次のように簡単です。

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

あなたの状況はわかりません。実際のバイトサイズが必要な場合、それを行うとは思わない。 UIImagePNGRepresentationまたはUIImageJPEGRepresentationを使用して、画像の圧縮データのNSDataオブジェクトを取得できます。

非圧縮画像(ピクセルデータ)の実際のサイズを取得したいと思います。 UIImage *またはCGImageRefを生データに変換する必要があります。これは、UIImageをIplImage(OpenCVから)に変換する例です。十分なメモリを割り当てて、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

スウィフト3:

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

人間が読める形式で必要な場合は、 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)は数値形式で必要なものです。

0
TheTiger