Dapatkan ukuran UIImage (panjang byte) tidak tinggi dan lebar

I'm mencoba untuk mendapatkan panjang UIImage. Tidak lebar atau tinggi gambar, tetapi ukuran dari data.

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

Data yang mendasarinya yang UIImage dapat bervariasi, sehingga untuk sama "gambar" seseorang dapat memiliki berbagai ukuran dari data. Satu hal yang dapat anda lakukan adalah menggunakan UIImagePNGRepresentation atau UIImageJPEGRepresentation untuk mendapatkan setara dengan NSData konstruksi untuk baik, kemudian memeriksa ukuran yang.

Komentar (2)

Gunakan CGImage properti UIImage. Kemudian menggunakan kombinasi CGImageGetBytesPerRow * CGImageGetHeight, tambahkan di sizeof UIImage, anda harus hanya beberapa byte dari ukuran sebenarnya.

Ini akan mengembalikan ukuran dari gambar, tidak terkompresi, jika anda ingin menggunakannya untuk keperluan seperti malloc dalam persiapan untuk manipulasi bitmap (dengan asumsi 4 byte pixel format 3 byte untuk RGB dan 1 untuk 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;
Komentar (1)
- (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];
   }
}
Komentar (4)

Contoh di Swift:

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

Berikut ini adalah cara tercepat, paling bersih, paling umum, dan paling rawan kesalahan cara untuk mendapatkan jawabannya. Dalam kategori UIImage+Stick:

#import 

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

Atau jika anda hanya ingin sebenarnya bitmap dan tidak UIImage contoh wadah, maka hal ini benar-benar sederhana seperti ini:

- (size_t) memorySize
{
  return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}
Komentar (0)

I'm tidak yakin situasi anda. Jika anda memerlukan sebenarnya ukuran byte, I don't pikir anda melakukan itu. Anda dapat menggunakan UIImagePNGRepresentation atau UIImageJPEGRepresentation untuk mendapatkan NSData objek kompresi data citra.

Saya pikir anda ingin mendapatkan ukuran yang sebenarnya dari gambar terkompresi(piksel data). Anda perlu mengkonversi UIImage* atau CGImageRef untuk data mentah. Ini adalah contoh konversi UIImage untuk IplImage(dari OpenCV). Anda hanya perlu mengalokasikan cukup memori dan lulus pointer ke CGBitmapContextCreate's pertama arg.

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);
Komentar (0)

Swift 3:

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

Jika diperlukan dalam bentuk yang dapat dibaca manusia kita dapat menggunakan ByteCountFormatter

if let data = UIImageJPEGRepresentation(image, 1.0) {
   let fileSizeStr = ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: ByteCountFormatter.CountStyle.memory)
   print(fileSizeStr)
}

Di mana Int64(data.count) adalah apa yang anda butuhkan dalam format numerik.

Komentar (0)

SWIFT 4+

let imgData = image?.jpegData(compressionQuality: 1.0)
debugPrint("Size of Image: \(imgData!.count) bytes")

anda dapat menggunakan trik ini untuk mengetahui ukuran gambar.

Komentar (0)