#iphone #objective-c
#iPhone #objective-c
Вопрос:
Я хочу знать, что размер файла изображения в фотоальбоме iPhone, выбранный UIImagePickerController.
Я пробовал этот код с 1 571 299 байтами изображения в формате jpeg.
UIIamge *selectedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
NSData *imageData;
if ( /* PNG IMAGE */ )
imageData = UIImagePNGReprensentation(selectedImage);
else
imageData = UIImageJPEGReprensentation(selectedImage);
NSUInteger fileLength = [imageData length];
NSLog(@"file length : [%u]", fileLength);
Но когда я запускаю код, он печатает 362788 байт.
Есть ли кто-нибудь, кто это знает?
Комментарии:
1. Вы уверены, что блок else выполняется? Это слишком большая разница.
2. Но ваше условие проверить, является ли это файлом PNG, закомментировано. Попробуйте один раз, закомментировав блок if.
3. Я проверил свой блок условий. Он работает правильно.
UIIamge *selectedImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; NSData *imageDataPNG = UIImagePNGRepresentation(selectedImage); NSData *imageDataJPG = UIImageJPEGRepresentation(selectedImage, 1.0f); NSUInteger fileLengthPNG = [imageDataPNG length]; NSUInteger fileLengthJPG = [imageDataJPG length]; dLog(@"-->> fileSizePNG : [%u]", fileLengthPNG); dLog(@"-->> fileSizeJPG : [%u]", fileLengthJPG);
Но вывод был таким. —>> fileSizePNG: [794372] ->> fileSizeJPG: [362788]4. Такой подход не будет работать, по крайней мере, с изображениями в формате JPEG. Вы повторно сжимаете изображение, которое не даст исходный размер файла. Кстати, какую настройку качества сжатия вы используете. Для
UIImageJPEGRepresentation()
функции требуется два аргумента. Ваш приведенный выше код даже не будет компилироваться.
Ответ №1:
Если у вас есть такой код, чтобы сделать снимок:
UIImagePickerController *controller = [[[UIImagePickerController alloc] init] autorelease];
controller.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
controller.delegate = self;
[self presentModalViewController:controller animated:YES];
Затем вы можете получить размер файла выбранного изображения следующим образом:
NSURL *assetURL = [info objectForKey:@"UIImagePickerControllerReferenceURL"];
ALAssetsLibrary *library = [[[ALAssetsLibrary alloc] init] autorelease];
[library assetForURL:assetURL resultBlock:^(ALAsset *asset) {
NSLog(@"Size: %lld", asset.defaultRepresentation.size);
} failureBlock:nil];
Если тип источника UIImagePickerControllerSourceTypeCamera
равен, вы должны сохранить изображение в памяти на диск, прежде чем извлекать его размер файла.
Ответ №2:
Как сказали некоторые комментаторы, даже если мы предполагаем, что методология верна, вы все равно перерабатываете изображение, поэтому размеры байтов не будут совпадать. Я использую следующий метод для изображений JPG, ymmv для PNG:
(NSInteger)bytesInImage:(UIImage *)image {
CGImageRef imageRef = [image CGImage];
return CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);
}
Однако, как отметил комментатор, приведенное выше, возвращает несжатый размер.
Комментарии:
1. Это несжатый размер; похоже, что первоначальный вопрос был исходным сжатым размером…
2. Хороший момент! Я вполне могу изменить ответ, если смогу придумать решение. Мое первое предложение по-прежнему остается верным.
Ответ №3:
вот в Swift 4
extension UIImage {
var memorySize: Int {
guard let imageRef = self.cgImage else { return 0 }
return imageRef.bytesPerRow * imageRef.height
}
}