2014-11-01 2 views
0

Поэтому я сталкиваюсь с некоторыми проблемами, когда занимаюсь обрезкой изображения. Мне известно два возможных способа: UIGraphicsBeginImageContextWithOptions в сочетании с методами drawAtPoint:blendMode: и CGImageCreateWithImageInRect. Они оба работают, но имеют некоторые серьезные недостатки: первый способ занимает много времени (в моем случае около 7 секунд) и памяти (я получаю предупреждение о памяти) (предположим, я обрезаю изображение, сделанное камерой iPhone); второй заканчивается повернутым изображением, так что вам нужно поставить код сгустка, чтобы победить такое поведение, которое я не хочу. Я хочу знать, как, например, работает встроенная функция редактирования в яблоке приложения «Фотографии», или вольер или любой другой редактор фотографий. Рассмотрим редактор apple (iOS 8), вы можете повернуть изображение, изменить прямоугольник обрезки, они также имеют размытие (!) Вне прямоугольника вырезания и т. Д., Но когда вы применяете обрезку, оно занимает максимум 8 мб памяти, и это происходит немедленно. Как они это делают?Как использовать Open GL ES для обрезки изображения?

Единственное, что у меня есть, это то, что они используют потенциал графического процессора (например, вольер). Итак, если мы объединим все эти вопросы в одном, как я могу использовать Open GL, чтобы сделать обрезку менее болезненной? Я никогда не работал с ним, поэтому любые ссылки, ссылки и источники приветствуются. Спасибо заранее.

+0

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

+0

@ datenwolf Хорошо, не могли бы вы назвать некоторых из них, пожалуйста? – efimovdk

ответ

0

Как уже упоминалось это не должно, скорее всего, будет сделано с OpenGL, но даже если ...

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

- (CGRect)fillSizeForSource:(CGRect)source target:(CGRect)target 
{ 
    if(source.size.width/source.size.height > target.size.width/target.size.height) 
    { 
     // keep target height and make the width larger 
     CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height); 
     return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height); 
    } 
    else 
    { 
     // keep target width and make the height larger 
     CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width)); 
     return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height); 
    } 
} 

- (CGRect)fitSizeForSource:(CGRect)source target:(CGRect)target 
{ 
    if(source.size.width/source.size.height < target.size.width/target.size.height) 
    { 
     // keep target height and make the width smaller 
     CGSize newSize = CGSizeMake(target.size.height * (source.size.width/source.size.height), target.size.height); 
     return CGRectMake((target.size.width-newSize.width)*.5f, .0f, newSize.width, newSize.height); 
    } 
    else 
    { 
     // keep target width and make the height smaller 
     CGSize newSize = CGSizeMake(target.size.width, target.size.width * (source.size.height/source.size.width)); 
     return CGRectMake(.0f, (target.size.height-newSize.height)*.5f, newSize.width, newSize.height); 
    } 
} 

Я не тестировал это.

Или, поскольку вы находитесь на iOS, просто создайте изображение с нужным размером, добавьте в него изображение, а затем получите снимок экрана.

+0

Итак, эти методы превратят исходный прямоугольник в прямоугольник, который будет использоваться CGImageCreateWithImageInRect? – efimovdk

+0

Эта функция создает субимаж с заданным прямоугольником, который должен работать с подходящим методом, когда один из размеров равен исходному изображению .. Другими словами: Нет, поскольку он не будет изменять размер изображения. Вы можете использовать эти методы, чтобы получить право на то, где рисовать изображение в графическом контексте пользовательского ядра (размер цели должен быть размером контекста). Или вы можете использовать их для перерисовки изображения с помощью openGL. Или создайте представление с целевым прямоугольником и добавьте представление представления в виде представлений с помощью методов rect, чтобы получить тот же результат ... –

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