2015-10-27 3 views
0

Я работаю над графическим приложением, в котором пользователь может набросать поверх изображения. Но после эскиза изображения на некоторое время размер файла изображения резко возрастает. (например, если изображение jpeg размером 1,6 мб нарисовано в течение некоторого времени, оно становится 2,3 мб. Размер увеличивается в зависимости от количества эскизов) Если я делаю то же количество эскизов изображения, используя Preview на Mac, он не эффект размер файла изображения вообще. Ниже приведены примеры изображений до и после редактирования (как предел загрузки изображений здесь составляет 2 мб, я сделал лишь небольшое количество зарисовок)iOS - Рисунок на UIImage значительно увеличивает размер файла изображения

Image before editing - 1.6 mb

Image after editing - 2 mb

Не уверен, что вызывает резкое увеличение размера файла изображения. PFB - фрагмент кода.

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    currentLocation = [touch locationInView:containerImgVIew]; 
    UIGraphicsBeginImageContext(drawingView.frame.size); 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [drawingView.image drawInRect:CGRectMake(0, 0, drawingView.frame.size.width, drawingView.frame.size.height) blendMode:kCGBlendModeNormal alpha:1]; 
    CGContextSetLineCap(ctx, kCGLineCapRound); 
    CGContextSetLineWidth(ctx, slider.value); 
    CGContextBeginPath(ctx); 

    CGContextMoveToPoint(ctx, location.x, location.y); 
    CGContextAddLineToPoint(ctx, currentLocation.x, currentLocation.y); 
    CGContextStrokePath(ctx); 

    drawingView.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    location = currentLocation; 
} 

// touchesEnded method implemented same as touchesMoved 

- (IBAction)saveButtonTapped:(id)sender 
{ 
    UIGraphicsBeginImageContextWithOptions(_originalImageSize, YES, containerImgVIew.image.scale); 

    CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeNormal); 
    [containerImgVIew.image drawAtPoint:CGPointZero]; 

    CGFloat scale = _originalImageSize.width/drawingView.frame.size.width; 
    CGContextScaleCTM(UIGraphicsGetCurrentContext(), scale, scale); 
    [drawingView.layer renderInContext:UIGraphicsGetCurrentContext()]; 

    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    NSData *jpgData = UIImageJPEGRepresentation(viewImage, 1); 
} 

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

ответ

0

Фотографии на iPhone хранятся в виде файлов JPEG. Файлы JPEG всегда сжимаются. «... не использовать сжатие» не является достижимым требованием.

Фотографии, сделанные с помощью камеры устройства, хранятся примерно в 0,75 качества (я оцениваю). Когда вы создаете экземпляр UIImage из JPEG, сжатые данные на диске распаковываются, и во время его редактирования в RAM появляется несжатое изображение полного размера. Эта копия в памяти немного ухудшилась, если через сжатие и декомпрессию JPEG один раз.

Вы редактируете несжатое изображение в памяти. Когда вы сохраняете свои изменения, вы снова сжимаете данные изображения в формате JPEG. Вы вызываете UIImageJPEGRepresentation и выбираете уровень сжатия. Выбор значения около 0,75 должен дать вам аналогичный размер файла для загруженного вами изображения.

Каждый раз, когда вы сжимаете изображение в формате JPEG, вы слегка деградируете его. При высоких настройках качества JPEG эти ухудшения совершенно незаметны. Это итеративное ухудшение просто часть работы с форматом сжатия с потерями, например JPEG.

+0

Спасибо за объяснение @alexkent. Еще одно сомнение. Когда я использовал UIImageJPEGRepresentation (изображение, 0.99) без редактирования и сохранения данных непосредственно на диск, размер файла изображения становится почти наполовину. Это идеальное поведение? – Manoj

1

Вы можете выбрать более низкое качество для кодирования JPEG в вашем saveButtonTapped

NSData* jpgData = UIImageJPEGRepresentation(viewImage, 0.8); 

Что-то вроде 0,8 не должно быть слишком заметным, и должны реально улучшить размеры файлов.

+0

@Manoj сообщите, если это помогло –

+0

спасибо за ответ Piyush. Но я пробовал это и заметил, что качество слишком мало. Но мы не должны использовать сжатие. Есть ли способ достичь этого? – Manoj

+0

Ah ok lemme найти другую альтернативу, тогда –

Смежные вопросы