Я пытаюсь получить длину UIImage
. Не ширина или высота изображения, а размер данных.
Получите размер UIImage (длина байтов), а не высота и ширина
Ответ 1
Базовые данные UIImage
могут варьироваться, поэтому для одного и того же "изображения" могут быть разные размеры данных. Единственное, что вы можете сделать, это использовать UIImagePNGRepresentation
или UIImageJPEGRepresentation
, чтобы получить эквивалентные конструкторы NSData
, а затем проверить размер этого.
Ответ 2
UIImage *img = [UIImage imageNamed:@"sample.png"];
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
NSLog(@"Size of Image(bytes):%d",[imgData length]);
Ответ 3
Используйте свойство 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;
Ответ 4
- (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];
}
}
Ответ 5
Пример в Swift:
let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
Ответ 6
Это следующий самый быстрый, самый чистый, самый общий и наименее подверженный ошибкам способ получить ответ. В категории 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);
}
Ответ 7
Я не уверен в вашей ситуации. Если вам нужен фактический размер байта, я не думаю, что вы это делаете. Вы можете использовать представление UIImagePNGR или представление 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);
Ответ 8
Swift 3:
let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
print("Size: \(data.count) bytes")
}
Ответ 9
При необходимости в читаемой нами форме мы можем использовать 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)
- это то, что вам нужно в числовом формате.
Ответ 10
SWIFT 4+
let imgData = image?.jpegData(compressionQuality: 1.0)
debugPrint("Size of Image: \(imgData!.count) bytes")
вы можете использовать этот трюк, чтобы узнать размер изображения.