Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 获取UIImage的大小(字节长度),而不是高度和宽度_Iphone_Uiimage - Fatal编程技术网

Iphone 获取UIImage的大小(字节长度),而不是高度和宽度

Iphone 获取UIImage的大小(字节长度),而不是高度和宽度,iphone,uiimage,Iphone,Uiimage,我正在尝试获取UIImage的长度。不是图像的宽度或高度,而是数据的大小。UIImage的基础数据可能不同,因此对于同一个“图像”,可以有不同大小的数据。您可以使用UIImagePNGRepresentation或uiimagejpegresentation来获取这两种结构的等效NSData结构,然后检查其大小。使用UIImage的CGImage属性。然后使用CGImageGetBytesPerRow* CGImageGetHeight,添加UIImage的大小,应该在实际大小的几个字节之内 如

我正在尝试获取
UIImage
的长度。不是图像的宽度或高度,而是数据的大小。

UIImage的基础数据可能不同,因此对于同一个“图像”,可以有不同大小的数据。您可以使用
UIImagePNGRepresentation
uiimagejpegresentation
来获取这两种结构的等效
NSData
结构,然后检查其大小。

使用UIImage的CGImage属性。然后使用CGImageGetBytesPerRow*
CGImageGetHeight,添加UIImage的大小,应该在实际大小的几个字节之内

如果要将图像用于诸如malloc等目的以准备位图操作(假设4字节像素格式,RGB为3字节,Alpha为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);

Swift中的示例:

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;
}

Swift 3:

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

如果需要人类可读的形式,我们可以使用


其中,
Int64(data.count)
是您需要的数字格式。

SWIFT 4+

let imgData = image?.jpegData(compressionQuality: 1.0)
debugPrint("Size of Image: \(imgData!.count) bytes")
您可以使用此技巧确定图像大小。

Swift 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
    }
}

我认为这是处理UIImagePickerController时更优雅的解决方案这是使用UIIIImagePickerController Tunning解决方案的最佳答案兄弟…非常好地工作…每个人都建议使用JPEG表示法或PNGRepression…这些产生的图像大小不正确…非常麻烦。。你为我节省了很多时间。你使用imageURL找到了一个很好的解决方案来确定图像大小。是否有可能使用上述代码中的“image”(图像)从新拍摄的图像中获取图像?应将1.0替换为0;这是原始图像的质量。在UIImageJPEG表示中,为压缩质量传递的正确值应该是多少?1.0使计算的大小大于原始大小。@Nisarg,1.0提供最高的质量和最少的压缩。尝试使用0.6这是一个更好的压缩质量。NSData*imgData=uiimagejpegresentation(img,1);如果希望看到图像占用了多少内存,为什么要得到压缩大小?通过使用UIImageJPEG表示,您正在创建一个新的图像,它占用空间并复制周围的位;如果你不想消耗更多的内存,或者你的性能受到挤压,就不要这样做;(1)
image.size.height
image.size.width
将以CG单位给出大小,而不一定是像素。如果
.scale
属性不是1,您将得到错误的答案。(2) 假设每像素4字节,这对于RGBA图像是正确的,但对于灰度图像则不是。如果希望查看图像占用了多少内存,为什么要获取其压缩大小?通过使用UIImageJPEG表示,您正在创建一个新的图像,它占用空间并复制周围的位;如果您不想消耗更多内存或性能受到挤压,请不要这样做。正如我们所预期的,当使用UIImagePgrePresentation
UIImageJPEGRepresentation
时,UIImagePgreentation可能返回的大小为的一半,而
UIImagePgreentation
将不会返回原始大小
- (size_t) memorySize
{
  return CGImageGetHeight(self.CGImage) * CGImageGetBytesPerRow(self.CGImage);
}
let image = UIImage(named: "example.jpg")
if let data = UIImageJPEGRepresentation(image, 1.0) {
    print("Size: \(data.count) bytes")
}
if let data = UIImageJPEGRepresentation(image, 1.0) {
   let fileSizeStr = ByteCountFormatter.string(fromByteCount: Int64(data.count), countStyle: ByteCountFormatter.CountStyle.memory)
   print(fileSizeStr)
}
let imgData = image?.jpegData(compressionQuality: 1.0)
debugPrint("Size of Image: \(imgData!.count) bytes")
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
    }
}