我正在尝试获取 a 的长度UIImage
。不是图像的宽度或高度,而是数据的大小。
12 回答
UIImage *img = [UIImage imageNamed:@"sample.png"];
NSData *imgData = UIImageJPEGRepresentation(img, 1.0);
NSLog(@"Size of Image(bytes):%d",[imgData length]);
a 的基础数据UIImage
可能会有所不同,因此对于相同的“图像”,可以具有不同大小的数据。您可以做的一件事是使用UIImagePNGRepresentation
或UIImageJPEGRepresentation
获取两者的等效NSData
结构,然后检查其大小。
使用 UIImage 的 CGImage 属性。然后使用 CGImageGetBytesPerRow *
CGImageGetHeight 的组合,加上 UIImage 的 sizeof,你应该在实际大小的几个字节之内。
这将返回未压缩的图像大小,如果您想将其用于 malloc 等目的以准备位图操作(假设 RGB 为 4 字节像素格式,RGB 为 3 字节,Alpha 为 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;
- (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];
}
}
斯威夫特的例子:
let img: UIImage? = UIImage(named: "yolo.png")
let imgData: NSData = UIImageJPEGRepresentation(img, 0)
println("Size of Image: \(imgData.length) bytes")
以下是获得答案的最快、最干净、最通用和最不容易出错的方法。在一个类别中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);
}
斯威夫特 3:
let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
print("Size: \(data.count) bytes")
}
我不确定你的情况。如果您需要实际的字节大小,我认为您不会这样做。您可以使用 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);
斯威夫特 4+
let imgData = image?.jpegData(compressionQuality: 1.0)
debugPrint("Size of Image: \(imgData!.count) bytes")
您可以使用此技巧找出图像大小。
斯威夫特 4 和 5:
extension UIImage {
var sizeInBytes: Int {
guard let cgImage = self.cgImage else {
// This won't work for CIImage-based UIImages
assertionFailure()
return 0
}
return cgImage.bytesPerRow * cgImage.height
}
}
如果需要人类可读的形式,我们可以使用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)
您需要的数字格式在哪里。
我试图使用
let imgData = image.jpegData(compressionQuality: 1.0)
但它提供的小于图像的实际大小。然后我尝试使用 PNG 表示来获取大小。
let imageData = image.pngData()
但它提供的字节数比实际图像大小更多。
唯一对我有用的东西。
public func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
var asset: PHAsset!
if #available(iOS 11.0, *) {
asset = info[UIImagePickerControllerPHAsset] as? PHAsset
} else {
if let url = info[UIImagePickerControllerReferenceURL] as? URL {
asset = PHAsset.fetchAssets(withALAssetURLs: [url], options: .none).firstObject!
}
}
if #available(iOS 13, *) {
PHImageManager.default().requestImageDataAndOrientation(for: asset, options: .none) { data, string, orien, info in
let imgData = NSData(data:data!)
var imageSize: Int = imgData.count
print("actual size of image in KB: %f ", Double(imageSize) / 1024.0)
}
} else {
PHImageManager.default().requestImageData(for: asset, options: .none) { data, string, orientation, info in
let imgData = NSData(data:data!)
var imageSize: Int = imgData.count
print("actual size of image in KB: %f ", Double(imageSize) / 1024.0)
}
}
}