Вопрос по uiimage, iphone – Получить размер UIImage (длина в байтах), а не высоту и ширину

52

я пытаюсь получить длинуUIImage, Не ширина или высота изображения, а размер данных.

Ваш Ответ

9   ответов
17

geGetBytesPerRow *

CGImageGetHeight, добавьте размер UIImage, вы должны быть в пределах нескольких байтов от фактического размера.

Это вернет размер изображения без сжатия, если вы хотите использовать его для таких целей, как malloc при подготовке к манипулированию растровым изображением (при условии, что 4-байтовый пиксельный формат состоит из 3 байтов для RGB и 1 для альфы):

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;
Пара проблем здесь; (1)image.size.height а такжеimage.size.width даст вам размер в единицах компьютерной графики, а не обязательно в пикселях. Если.scale собственность нет 1, тысобираюсь получить неправильный ответ. (2) Вы принимаете 4 байта на пиксель, что верно для изображений RGBA, но не для изображений в градациях серого. Todd Lehman
0

При необходимости в удобочитаемой форме мы можем использовать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) это то, что вам нужно в числовом формате.

1

самый чистый, самый общий и наименее подверженный ошибкам способ получить ответ. В категории: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;
}
</objc>

Или, если вы хотите только фактическое растровое изображение, а не контейнер экземпляра UIImage, тогда это действительно так просто:

- (size_t) memorySize
{
  return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}
71
 UIImage *img = [UIImage imageNamed:@"sample.png"];
 NSData *imgData = UIImageJPEGRepresentation(img, 1.0); 
 NSLog(@"Size of Image(bytes):%d",[imgData length]);
@Meet Если выпытаемся получить размер изображения, каким бы вы нене нужно никакого сжатия, или результат нене будет правильным. user470763
Если вы хотите увидеть, сколько памяти занимает изображение, зачем вам его получать?сжатый размер? И используя UIImageJPEGRepresentation, вы создаете новое изображение, которое занимает пространство и копирует биты вокруг; дон»не делай этого, если ты неНе нужно больше памяти или если вы ограничены в производительности. mahboudz
@Nisarg, 1.0 дает высочайшее качество и наименьшее сжатие. Попробуйте с 0.6 его лучшее качество с замечательным сжатием. Meet
Вместо 0 следует поставить 1,0; Это'S качество от оригинального изображения. wzbozon
12
- (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];
   }
}
Я думаю, что это более элегантное решение, когда вы имеете дело с UIImagePickerController D33pN16h7
Это лучший ответ для работы с UIIImagePickerController पवन
Сногсшибательное решение, брат .... Отлично работает ... Все советуют использовать JPEGRepresentation или PNGRepresentation ... Эти получающиеся изображения неправильного размера ... Большое спасибо .. Вы сэкономили много моего времени. SURESH SANKE
Вы дали хорошее решение, используя imageURL, чтобы узнать размер изображения. Есть ли возможность получить его из вновь захваченного изображения, используя "образ" как в приведенном выше коде? SURESH SANKE
32

UIImage может меняться, так что за одно и то жеобраз" можно иметь разные размеры данных. Одна вещь, которую вы можете сделать, это использоватьUIImagePNGRepresentation или жеUIImageJPEGRepresentation чтобы получить эквивалентNSData конструкции для любого, а затем проверьте размер этого.

UIImageJPEGRepresentation а такжеUIImagePNGRepresentation не вернет оригинальный размер NSLeader
Как и следовало ожидать, UIImageJPEGRepresentation может возвращать половину размера при использовании UIImagePNGRepresentation onmyway133
7

Пример вSwift:

let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
Если вы хотите увидеть, сколько памяти занимает изображение, зачем вам его получать?сжатый размер? И используя UIImageJPEGRepresentation, вы создаете новое изображение, которое занимает пространство и копирует биты вокруг; дон»не делай этого, если ты нене нужно больше памяти или если вы ограничены в производительности. mahboudz
1

я неЯ думаю, ты это делаешь. Вы можете использовать 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

Свифт 3:

if let data = UIImageJPEGRepresentation(image, 1.0) {
    print("Size: \(data.count) bytes")
}

Похожие вопросы