Согласно этому сеансу Глубокое погружение в память iOS, нам лучше использовать ImageIO
для уменьшения изображения.
Плохое использование UIImage
уменьшенных изображений.
- Будет распаковывать исходное изображение в память
- Внутренние преобразования координатного пространства являются дорогостоящими
Используйте ImageIO
ImageIO может считывать размеры изображений и информацию о метаданных, не загрязняя память.
ImageIO может изменять размер изображений только за счет измененного изображения.
Об изображении в памяти
- Использование памяти связано с размерами изображений, а не с размером файла.
UIGraphicsBeginImageContextWithOptions
всегда использует формат рендеринга SRGB
, который использует 4 байта на пиксель.
- Изображение имеет
load -> decode -> render
3 фазы.
UIImage
дорого для размера и изменения размера
Для следующего изображения, если вы используете UIGraphicsBeginImageContextWithOptions
, нам нужно всего 590 КБ для загрузки изображения, а нам нужно 2048 pixels x 1536 pixels x 4 bytes per pixel
= 10 МБ при декодировании
в то время как UIGraphicsImageRenderer
, представленный в iOS 10, автоматически выберет лучший графический формат в iOS12. Это означает, что вы можете сэкономить 75% памяти, заменив UIGraphicsBeginImageContextWithOptions
на UIGraphicsImageRenderer
, если вам не нужен SRGB.
Это моя статья об образах iOS в памяти
func resize(url: NSURL, maxPixelSize: Int) -> CGImage? {
let imgSource = CGImageSourceCreateWithURL(url, nil)
guard let imageSource = imgSource else {
return nil
}
var scaledImage: CGImage?
let options: [NSString: Any] = [
// The maximum width and height in pixels of a thumbnail.
kCGImageSourceThumbnailMaxPixelSize: maxPixelSize,
kCGImageSourceCreateThumbnailFromImageAlways: true,
// Should include kCGImageSourceCreateThumbnailWithTransform: true in the options dictionary. Otherwise, the image result will appear rotated when an image is taken from camera in the portrait orientation.
kCGImageSourceCreateThumbnailWithTransform: true
]
scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary)
return scaledImage
}
let filePath = Bundle.main.path(forResource:"large_leaves_70mp", ofType: "jpg")
let url = NSURL(fileURLWithPath: filePath ?? "")
let image = resize(url: url, maxPixelSize: 600)
or
// Downsampling large images for display at smaller size
func downsample(imageAt imageURL: URL, to pointSize: CGSize, scale: CGFloat) -> UIImage {
let imageSourceOptions = [kCGImageSourceShouldCache: false] as CFDictionary
let imageSource = CGImageSourceCreateWithURL(imageURL as CFURL, imageSourceOptions)!
let maxDimensionInPixels = max(pointSize.width, pointSize.height) * scale
let downsampleOptions =
[kCGImageSourceCreateThumbnailFromImageAlways: true,
kCGImageSourceShouldCacheImmediately: true,
// Should include kCGImageSourceCreateThumbnailWithTransform: true in the options dictionary. Otherwise, the image result will appear rotated when an image is taken from camera in the portrait orientation.
kCGImageSourceCreateThumbnailWithTransform: true,
kCGImageSourceThumbnailMaxPixelSize: maxDimensionInPixels] as CFDictionary
let downsampledImage =
CGImageSourceCreateThumbnailAtIndex(imageSource, 0, downsampleOptions)!
return UIImage(cgImage: downsampledImage)
}
person
RY_ Zheng
schedule
03.05.2020