Поместите изображение на больший размер холста с помощью графического процессора (возможно, CIFilters) без использования контекста изображения.

Допустим, у меня есть изображение размером 100x100. Я хочу разместить изображение на холсте большего размера, 500x500.

Мой текущий подход заключается в использовании UIGraphics для создания контекста, а затем рисования изображения в контексте.

UIGraphics.BeginImageContext(....);
ImageView.Draw (....);

Это прекрасно работает, но не так быстро, как хотелось бы для того, чем я занимаюсь. Я заметил, что CIFilters работают очень быстро. Можно ли разместить изображение на холсте большего размера с помощью CIFilters или другого метода, использующего GPU, а не CPU?? Я экспериментировал с CIFilters CICrop и CIPerspectiveTransform, но могу не похоже, чтобы получить желаемый результат...

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

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

Мое желаемое изображение результата 500x500. Я просто хочу взять изображение и увеличить его размер холста с помощью CIFilters или какой-либо операции с графическим процессором.

Я попытался сделать «обратную обрезку» с помощью CICrop, но это не сработало. Обратите внимание, что я указал размер CIVector как 500x500, хотя само изображение имеет размер 100x100, результирующее изображение полностью игнорировало это дополнительное пространство и обрезало его. Вот мой код:

        CICrop crop = new CICrop();
        crop.Image = ImageView.Image.CGImage;
        crop.Rectangle = new CIVector(0, 0, 500, 500);
        ImageView.Image = new UIImage(crop.OutputImage);
        Console.WriteLine("ImageView.Image.size = "+ ImageView.Image.Size);

person LampShade    schedule 13.04.2013    source источник


Ответы (1)


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

Что вам нужно, так это фильтр от накипи. Чтобы добиться этого с помощью CoreImage, вам нужно сделать что-то вроде этого:

CIImage *input = [CIImage imageWithCGImage: ImageView.Image.CGImage]; // input image is 100 X 100
CGAffineTransform transform = CGAffineTransformMakeScale(5.0f, 5.0f); // Scale by 5 times along both dimensions
CIImage *output = [input imageByApplyingTransform: transform];
// output image is now 500 X 500
person terapixel    schedule 01.05.2013
comment
Я понимаю, как работает обрезка. Я просто пытаюсь придумать умный способ изменить размер холста изображения с помощью CIFilters, поскольку фильтры CI такие быстрые! Масштаб не будет делать то, чего я пытаюсь достичь. Масштаб будет масштабировать все изображение, я хочу, чтобы само изображение оставалось того же размера/размеров, но увеличивалось только полотно (т. затем измените размер холста на 500x500. - person LampShade; 01.05.2013
comment
@LampShade - извините, я неправильно понял ваш вопрос! Я думаю, вы можете добиться того, что ищете, с помощью фильтра компоновки исходного кода (developer.apple.com/library/mac/#documentation/graphicsimaging/). Фоновое изображение фильтра Source-Over = [CIImage imageWithColor:white]; входное изображение = ваше изображение 100X100; И соедините этот фильтр с кроп-фильтром 500X500. Вывод фильтра обрезки должен быть тем, что вы ищете? - person terapixel; 02.05.2013
comment
Похоже, это должно работать, но я боролся с тем, как разместить изображение 100x100 именно там, где я хочу? После фильтра Source-Over расположение изображения 100x100 всегда X-0, Y-0. А если я хочу, чтобы это был Х-50, Y-152? Кажется, я не могу его позиционировать... Есть идеи? И не беспокойтесь о недоразумении! - person LampShade; 03.05.2013