Подтвердить что ты не робот

Как повысить качество изображения в системе ImageIO iOS?

Я прошел обычный процесс постепенного обнаружения наилучшего решения для изменения размера изображения в iOS, и я закончил с ImageIO.

Хорошо работает следующее:

if let currentImage = CGImageSourceCreateWithData(imageData, nil)

   //...some code that extracts the existing size, and based on my maximum expected horizontal size..calculates a new horizontal/vertical maximum size..

let options: CFDictionary = [kCGImageSourceThumbnailMaxPixelSize as NSString            : maximumImageWidthOrHeight,
                             kCGImageSourceCreateThumbnailFromImageAlways as NSString   : true]

CGImageSourceCreateThumbnailAtIndex(image, options)

но только для сбрасывания вниз.

Если у меня есть изображение с полным HD, т.е. 1920 x 1080, он изменяется (с сохранением пропорций), так что он вставляется в 320 пикселей в горизонтальном направлении, потому что это то, что я установил как максимальный горизонтальный размер.

Однако, если я передаю изображение размером 16 пикселей x 9 пикселей.. действительно маленькое (и, очевидно, соотношение сторон 16: 9). Это изображение не изменяется.

Я хочу, чтобы он был изменен до 320 x 180 пикселей.

Есть ли комбинация опций/пропущенного вызова метода/что-нибудь, что даст мне это в каркасе imageIO?

4b9b3361

Ответ 1

Короткий ответ будет заключаться в том, что вы не можете сделать это с помощью ImageIO.

ImageIO предназначен для загрузки изображений постепенно (как в веб-изображениях), создания быстрых эскизов (которые максимальный размер strong > будет одним из исходного изображения) и создаст группы кэшированных или нет изображений. Здесь руководство

Самый простой способ - использовать UIKit и использовать коэффициенты масштабирования в диапазоне (0 < 1).

например, перейти от изображения 16x9 к 230x180 будет:

 let image = UIImage(data: yourImageData!, scale: 0.050)!

Существуют и другие способы, описанные в NSHipster, которые немного сложнее, но могут стоить взглянуть на них и сделать некоторые тесты производительности выберите, какой из них лучше взбираться. Но это до вас, чтобы проверить.

В любом случае результаты будут довольно плохими, поскольку повышающая дискретизация все еще находится в стадии исследования и является действительно трудной задачей.

Есть несколько статей по этой теме, но они обычно связаны до upsampling определенного типа объектов, и это позволяет алгоритм, чтобы сделать некоторые необходимые предположения, например: Галлюцинационные лица: суперразрешение и связанное остальное TensorPatch Компенсация

Если бы я выбрал способ достичь этого, и качество было моей целью, я бы пошел на OpenCV алгоритмы суперразрешения.

Но они итеративные алгоритмы, поэтому, возможно, не соответствуют вашим потребностям.

Здесь показана демонстрация того, как она работает с популярным изображением " Лена"

Итак, вам может потребоваться переосмыслить, насколько это важно для вашего приложения, и, возможно, найти обходное решение, так как не будет возможности достичь как качественного, так и близкого к реальному времени производительности прямо сейчас, ; -)

Счастливое кодирование!

Ответ 2

UpSampling Images, несколько примечаний:

(к сожалению, это будет записано в Objective-C, частично из-за сложности самого ImageMagick, написанного на C-коде, и что нет ObjC или Swift)

ImageMagick

Возможно, одна из самых больших библиотек модемов изображений - ImageMagick, эта библиотека была построена довольно многими людьми, в частности, примечание: Nicolas Robidoux, который в настоящее время работает в качестве старшего научного сотрудника на первом этапе. Первый этап:

Первая фаза - мировой лидер в открытой платформе, high-end medium системы и решения для систем видеонаблюдения. Наши продукты известны своими качество, гибкость и скорость, позволяющие профессиональным фотографам снимать широкий диапазон форматов.

У Николаса есть докторская диссертация по прикладной математике из Университета Нью-Мексико, и он довольно долго работал над ImageMagick. Здесь, что Николас должен сказать о перевыборах изображений:

http://www.imagemagick.org/Usage/filter/nicolas/#upsampling

Рекомендуемые методы дискретизации (увеличение)Результаты изменения размера с использованием фильтр LanczosSharp EWA через сигмоидизированное цветовое пространство довольно artefact бесплатно, если немного размыто. Встроенный LanczosSharp, обсужденный в коротком ответе, хорошо работает, но я предпочитаю версию с немного меньше размытости, полученной с помощью "-фильтра Lanczos -define Фильтр:. размытость = 0,9891028367558475"

convert {input} -colorspace RGB + сигмоидально-контрастный 7.5 \           -фильтр Lanczos -define filter: blur =.9891028367558475 \           -distort Изменить размер 500% \           -sigmoidal-contrast 7.5 -colorspace sRGB {output}

Вы получите почти одинаковые результаты со встроенным LanczosSharp фильтр, который получается путем замены "-фильтра Lanczos -define filter: blur =.9891028367558475" от "-filter LanczosSharp".

Ничего себе, это отличный материал, что еще говорит нам Николай:

http://www.imagemagick.org/Usage/filter/nicolas/

При изменении размера я (Nicolas Robidoux) обычно придерживается либо тензора (ортогональный или 2-проходный) Фильтр параметров Resize (-resize) или EWA (Эллиптическое взвешенное усреднение) Изменение размера искажающего (-distort Resize) оператор. Хотя ядра фильтра используются с тензором и EWA операции строятся с использованием тех же семейств математических функции, они дают очень разные результаты при использовании с -resize и при использовании с -distort Resize.

Если вы хотите использовать один фильтр для всего и скорее избегать осложнений, таких как манипуляции с цветовым пространством и фантазии параметров, используйте LanczosSharp EWA (эллиптическое взвешенное усреднение) Фильтр. Он создает изображения, слегка расплывчатые, без зубцов говорить и разумно мягкие ореолы.

Звучит наполовину сложным, поэтому давайте посмотрим, что мы можем НАСТОЯТЕЛЬНО сделать ЛЕГКО в IOS, учитывая некоторые уже доступные инструменты, которые поддерживаются в актуальном состоянии и являются супер-IOS.

Как мы это делаем в IOS?, ну, есть ImageMagick POD, если вы хотите попробовать, неудачная часть состоит в том, что с ней сложно работать. И, там также Брэд Ларсон GPU Image, (спасибо Брэд!, великая библиотека). Итак, ради времени, я собираюсь придерживаться библиотеки обработки Brad GPUImage, чтобы дать вам быстрый вкус "upsampling" и то, что вы можете ожидать. Я собираюсь использовать фильтры Shapren и Lanczos, поскольку Николас предлагает, к сожалению, насколько мне известно, похоже, что у GPUImage нет фильтра "тензор" или "LanczosSharp EWA", не стесняйтесь исправить меня, если я ошибаюсь, Ну, с этим сказано, здесь мы идем:

Я собираюсь работать с этим изображением, это простой значок "книги":

введите описание изображения здесь

Размещение этого изображения в коде показывает следующее: это изображение, нетронутое, извлеченное XCode с использованием векторизованного PDF "значка книги" выше, здесь результаты:

НЕТ ИБП:

UIImage *inputImage = [UIImage imageNamed:@"book"];
cell.imageView.image = inputImage;

введите описание изображения здесь

LANCZOS UPSAMPLING:

UIImage *inputImage = [UIImage imageNamed:@"book"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageLanczosResamplingFilter *stillImageFilter = [[GPUImageLanczosResamplingFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
[stillImageSource forceProcessingAtSizeRespectingAspectRatio:CGSizeMake(200, 200)];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];
cell.imageView.image = currentFilteredVideoFrame;

введите описание изображения здесь

ВЫБОР САМОСТОЯТЕЛЬСТВА:

UIImage *inputImage = [UIImage imageNamed:@"book"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
GPUImageSharpenFilter *stillImageFilter = [[GPUImageSharpenFilter alloc] init];
[stillImageSource addTarget:stillImageFilter];
[stillImageFilter useNextFrameForImageCapture];
[stillImageSource processImage];
UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentFramebuffer];

введите описание изображения здесь

Итак, это дает вам краткое описание того, что, что касается повышения частоты дискретизации, очевидно, используя библиотеку ImageMagick, может или не может дать лучшие результаты, к сожалению, у меня нет времени погрузиться в голову, чтобы получить библиотеку ImageMagick и работает, но материал, который я включил в сообщение, поможет вам на пути к какому-то решению, хотя это, скорее всего, полу-размытое решение, но, тем не менее, лучшее решение, которое человечество может собрать вместе с нашими вычислениями технологии и современной математики. Возможно, там больше информации, которая является более поздней, что то, что я здесь перечислил, но для всех целей и целей, я чувствую, что информация, которую я связал, даст вам лучший шанс попасть туда, где вы хотите быть самым быстрым, если, конечно, у вас не будет времени написать свою собственную библиотеку изображений.

В любом случае, если вы хотите попытаться применить методы ImageMagick от Nicholas в своем приложении, не стесняйтесь сделать снимок, установив следующий POD:

pod 'ImageMagick', '6.8.8-9'

Для Брэда Ларсона GPUImage POD:

pod 'GPUImage'

Если у вас есть вопросы о том, как сделать работу библиотеки IOS ImageMagick:

http://blog.splitwise.com/2012/12/18/imagemagick-for-ios-armv7-and-armv7s/

https://github.com/marforic/imagemagick_lib_iphone

http://www.cloudgoessocial.net/2011/03/21/im-xcode4-ios4-3/

Если вы хотите взглянуть на то, что собрал Брэд Ларсон, здесь репозиторий github:

https://github.com/BradLarson/GPUImage

Чтобы развернуть мой ответ, я решил сначала перейти в ImageMagick голову, вот результаты, эти результаты основаны на PNG файле на этот раз, а не в векторном формате PDF:

прежде всего, убедитесь, что вы импортируете этот заголовок:

#import <wand/MagickWand.h>

и здесь ваша декларация свойства

@property (nonatomic) MagickWand *wand;

И вам нужно сделать старые, "viewDidUnlaod" вещи:

-(void)viewDidUnload
{
    if (self.wand)
        self.wand = DestroyMagickWand(self.wand);
    MagickWandTerminus();
}

Lanczos2SharpFilter

MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,100,100,Lanczos2SharpFilter, 2),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;

введите описание изображения здесь

RobidouxSharpFilter это фильтр Николаса

MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,75,75,RobidouxSharpFilter, 1),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;

введите здесь описание изображения

LanczosSharpFilter

MagickWandGenesis();
self.wand = NewMagickWand();
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"book" ofType:@"png"];
MagickReadImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
MagickResampleImage(self.wand,75,75,LanczosSharpFilter, 1),
MagickWriteImage(self.wand, [filePath cStringUsingEncoding:NSASCIIStringEncoding]);
UIImage *imgObj = [UIImage imageWithContentsOfFile:filePath];
cell.imageView.image = imgObj;

введите описание изображения здесь

Я, очевидно, мог продолжать идти по этой дороге, но теперь я оставлю это вам решать. Удачи, вот список всех фильтров, которые вы можете "ЛЕГКО" использовать с ImageMagick;

UndefinedFilter, PointFilter, BoxFilter, TriangleFilter,
HermiteFilter, HanningFilter, HammingFilter, BlackmanFilter,
GaussianFilter, QuadraticFilter, CubicFilter, CatromFilter,
MitchellFilter, JincFilter, SincFilter, SincFastFilter,
KaiserFilter, WelshFilter, ParzenFilter, BohmanFilter,
BartlettFilter, LagrangeFilter, LanczosFilter,
LanczosSharpFilter, Lanczos2Filter, Lanczos2SharpFilter,
RobidouxFilter, RobidouxSharpFilter, CosineFilter, SplineFilter, LanczosRadiusFilter, SentinelFilter

Ответ 3

Из документов для kCGImageSourceThumbnailMaxPixelSize:

Максимальная ширина и высота в пикселях эскиза. Если этот ключ не указан, ширина и высота эскиза не ограничены, а эскизы могут быть размером с само изображение.

(основное внимание).

Я думаю, это означает, что миниатюра не может быть больше оригинального изображения.

Ответ 4

Для этого вы можете сделать следующее:

let provider: CGDataProviderRef = CGDataProviderCreateWithCFData(imageData)
let currentImage: CGImageRef = CGImageCreate(
   320, // width
   180, // height
   8, // bitsPerComponent
   32, // bitsPerPixel
   2560, // bytesPerRow
   CGColorSpaceCreateDeviceRGB(), //colorSpace
   kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little, // bitmapInfo (direct memory copy options)
   provider, //image data
   nil, // decode
   true, // shouldInterpolate
   kCGRenderingIntentDefault // intent
   )
//Now you can use currentImage or create a UIImage from it depending on your needs.
let upScaled: UIImage = UIImage.imageWithCGImage(currentImage)
//Might need to release currentImage
//CGImageRelease(currentImage)