kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 Kevin
Kevin
Вопрос

Получение размера изображения UIImage (длина в байтах), а не высоты и ширины

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

57 2009-08-18T21:43:42+00:00 10
 rptwsthi
rptwsthi
Редактировал вопрос 14-го февраля 2013 в 11:15
Программирование
iphone
uiimage
 Meet
Meet
31-го января 2012 в 9:12
2012-01-31T09:12:29+00:00
Дополнительно
Источник
Редактировать
#9384808
 UIImage *img = [UIImage imageNamed:@"sample.png"];
 NSData *imgData = UIImageJPEGRepresentation(img, 1.0); 
 NSLog(@"Size of Image(bytes):%d",[imgData length]);
Lyndsey Scott
Lyndsey Scott
Редактировал ответ 26-го октября 2015 в 5:43
71
0
Решение / Ответ
 fbrereto
fbrereto
18-го августа 2009 в 10:33
2009-08-18T22:33:20+00:00
Дополнительно
Источник
Редактировать
#9384804

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

 rptwsthi
rptwsthi
Редактировал ответ 14-го февраля 2013 в 11:19
34
0
 mahboudz
mahboudz
19-го августа 2009 в 6:09
2009-08-19T06:09:09+00:00
Дополнительно
Источник
Редактировать
#9384805

Используйте свойство CGImage в UIImage. Затем, используя комбинацию CGImageGetBytesPerRow * CGImageGetHeight, добавьте sizeof UIImage, вы должны быть в пределах нескольких байт от фактического размера.

Это вернет размер изображения без сжатия, если вы хотите использовать его для таких целей, как malloc при подготовке к работе с растровой картой (предполагается, что формат пикселей 4 байта: 3 байта для RGB и 1 для 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;
 mahboudz
mahboudz
Редактировал ответ 31-го октября 2011 в 9:41
17
0
 Darkngs
Darkngs
21-го сентября 2011 в 1:03
2011-09-21T13:03:07+00:00
Дополнительно
Источник
Редактировать
#9384807
- (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];
   }
}
 Darkngs
Darkngs
Редактировал ответ 19-го января 2015 в 6:30
13
0
 King-Wizard
King-Wizard
18-го марта 2015 в 9:54
2015-03-18T09:54:43+00:00
Дополнительно
Источник
Редактировать
#9384809

Пример в Стриж:

let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
7
0
Todd Lehman
Todd Lehman
14-го мая 2016 в 12:15
2016-05-14T00:15:10+00:00
Дополнительно
Источник
Редактировать
#9384810

Это самый быстрый, самый чистый, самый общий и менее подверженный ошибкам способ получить ответ. В категории объектами 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);
}
Ankit Kumar
Ankit Kumar
Редактировал ответ 6-го января 2017 в 5:53
4
0
Mike Chen
Mike Chen
19-го августа 2009 в 7:02
2009-08-19T07:02:39+00:00
Дополнительно
Источник
Редактировать
#9384806

Я не уверен в вашей ситуации. Если вам нужен фактический размер байта, я не думаю, что вы это сделаете. Вы можете использовать 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
0
 chengsam
chengsam
6-го октября 2017 в 8:23
2017-10-06T08:23:41+00:00
Дополнительно
Источник
Редактировать
#9384811

Свифт 3:

let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
    print("Size: \(data.count) bytes")
}
1
0
 TheTiger
TheTiger
17-го апреля 2018 в 12:22
2018-04-17T12:22:33+00:00
Дополнительно
Источник
Редактировать
#9384812

При необходимости в читаемую форму, мы можем использовать ByteCountFormatter

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

Где `типа int64(данные.граф) - это то, что вам нужно в числовом формате.

 TheTiger
TheTiger
Редактировал ответ 17-го апреля 2018 в 1:14
0
0
Hamid Shahsavari
Hamid Shahsavari
3-го октября 2019 в 3:55
2019-10-03T15:55:37+00:00
Дополнительно
Источник
Редактировать
#9384813

Свифт 4+

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

вы можете использовать этот трюк, чтобы выяснить размер изображения.

0
0
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Денис Васьков
Зарегистрирован 17 часов назад
2
Dima Patrushev
Зарегистрирован 2 дня назад
3
sirojidddin otaboyev
Зарегистрирован 1 неделю назад
4
Елена Гайдамамакинат
Зарегистрирован 1 неделю назад
5
Иван Степанюк
Зарегистрирован 1 неделю назад
ID
JA
KO
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией