iOS: есть ли способ сжать растровый файл на диске в png, не загружая все растровые данные в память? - PullRequest
0 голосов
/ 31 января 2019

Я хочу создать изображение с высоким разрешением в iOS.

У меня есть много изображений, которые, как ожидается, будут склеены вместе. Однако обычным способом (Core Graphics) получают весь размер памяти, которая может быть неправильно распределена, что можетСбой моего приложения, когда окончательное изображение слишком велико. Затем я попытался с помощью каркаса ImageIO. Сначала я использую CGDataProvider, чтобы получить двоичные данные от каждого изображения, и использую NSOutputStream, чтобы записать все данные в файл на диске один за другим. Затем яу меня есть несжатый растровый файл на диске, который я могу отобразить на экране или загрузить на свой сервер. Но размер файла слишком велик, как у изображения. Я пытаюсь сжать его в файл png. Я пробовал CGImageDestination:

Я загружаю растровый файл как CGImageRef, используя CGDataProvider. Насколько я знаю, эта операция не загружает все растровое изображение в память.

let provider = CGDataProvider.init(url: tmpBinaryDataPath as CFURL)
let imageInfo = self.images?.first?.getBitmapInfo()
let bufferSize = self.dataSource?.bufferSize(forCompositor: self)
let image = CGImage.init(
                          width: Int((bufferSize?.width)!), 
                         height: Int((bufferSize?.height)!), 
               bitsPerComponent: imageInfo.bigtsPerComponent,
                   bitsPerPixel: imageInfo.bitsPerPixel,
                    bytesPerRow: imageInfo.bytesPerRow, 
                          space: imageInfo.colorSpace, 
                     bitmapInfo: imageInfo.bigmapInfo,
                       provider: provider, 
                         decode: nil, 
              shouldInterpolate: false,
                         intent: imageInfo.renderingIntent)

Затем я использую CGImageDestination для его сжатия

let imageDest = CGImageDestinationCreateWithURL(outputPath as CFURL, kUTTypePNG, 1, nil)
CGImageDestinationAddImage(imageDest, result, nil)
let writeSuccess = CGImageDestinationFinalize(imageDest)

Все идет хорошо до тех пор, пока не будет вызван CGImageDestinationFinalize . Это будет стоить слишком много памяти.при размере изображения (1125 24360) индикатор памяти увеличивается до 300 МБ.

Нет утечек.

Итак, есть ли способ сжать файл растрового изображения на дискев png без загрузки всех растровых данных в память? Или, может быть, есть способ сжимать файл png шаг за шагом?

Любое предложение будет с благодарностью. Спасибо за чтение.

...