Как мне воссоздать UIImage с более низким сжатием в iOS? - PullRequest
5 голосов
/ 02 января 2012

У меня есть код для воссоздания высококачественного изображения с очень плохим качеством, но я немного смущен результатами, которые вижу.Код здесь:

NSData *compressedData = UIImageJPEGRepresentation(bigImage,0);
NSLog(@"compressedData length = %d", [compressedData length]);
self.currentImage = [UIImage imageWithData:compressedData];
NSData *dataAfterCompression = UIImageJPEGRepresentation(self.currentImage,1);
NSLog(@"dataAfterCompression length = %d", [dataAfterCompression length]);

Какие выходные данные:

2012-01-02 02:47:05.615 MyApp[349:707] compressedData length = 32671
2012-01-02 02:47:06.143 MyApp[349:707] dataAfterCompression length = 251144

Почему создание нового изображения с данными низкого качества приводит к такому большому изображению?

Ответы [ 2 ]

9 голосов
/ 05 января 2012

Входные данные для UIImageJPEGRepresentation представляют собой двумерный массив пикселей, а не сжатые данные, из которых был создан этот двумерный массив.(Массив, возможно, вообще не был получен из сжатых данных!) UIImageJPEGRepresentation ничего не знает о том, откуда пришло изображение, и не имеет никакого понятия о «качестве» его ввода.Он просто знает, что вы хотите, чтобы он очень старался сделать вывод маленьким (когда compressionQuality равен нулю), или вы хотите, чтобы он очень старался сделать вывод точным (когда compressionQuality равен единице).

Алгоритм сжатия JPEG имеет несколько настраиваемых параметров.Значение compressionQuality выбирает набор этих параметров.Когда вы устанавливаете compressionQuality в 1, компрессор использует набор параметров, которые обеспечивают очень небольшую потерю точности входных данных, независимо от того, что на самом деле являются эти входные данные.Для любых входных данных эти параметры приводят к очень небольшой потере точности.Компромисс в том, что эти параметры также приводят к очень небольшому сжатию.Затем компрессор не думает: «Хм, я должен попробовать использовать другие параметры и посмотреть, получу ли я ту же точность с лучшим сжатием».Если это то, что вы хотите, вы должны сделать это сами.

1 голос
/ 05 января 2012

Я не уверен, что это именно то, что вы ищете, но в этом блоге есть некоторые классы, расширяющие UIImage, и он довольно неплохо справляется со сжатием.Проверьте этот сайт: http://vocaro.com/trevor/blog/2009/10/12/resize-a-uiimage-the-right-way/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...