Запись маскированного изображения на диск в виде файла PNG - PullRequest
12 голосов
/ 10 ноября 2009

Обычно я загружаю изображения с веб-сервера, а затем кэширую их на диск, но перед тем, как сделать это, я хочу замаскировать их. Я использую код маскировки, который, кажется, все указывают на который можно найти здесь: http://iosdevelopertips.com/cocoa/how-to-mask-an-image.html

Что происходит, хотя, это то, что изображение отображается нормально, но версия, которая записывается на диск с

UIImage *img = [self maskImage:[UIImage imageWithData:data] withMask:self.imageMask];
[UIImagePNGRepresentation(img) writeToFile:cachePath atomically:NO];
У

альфа-канал инвертирован по сравнению с тем, который отображается позже (здесь используется тот же экземпляр UIImage).

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

Редактировать: Так что да, UIImagePNGRepresentation (img), похоже, инвертирует альфа-канал, не имеет ничего общего с кодом, записывающим на диск, что довольно очевидно, но я все равно проверил.

Ответы [ 3 ]

14 голосов
/ 18 апреля 2012

Как насчет рисования в новом изображении, а затем сохранить его?

UIGraphicsBeginImageContext(img.size);
[img drawAtPoint:CGPointZero];
UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[UIImagePNGRepresentation(newImg) writeToFile:cachePath atomically:NO];

(непроверенные)

5 голосов
/ 23 апреля 2012

См. Описание в CGImageCreateWithMask в CGImage Ссылка :

Полученное изображение зависит от того, является ли параметр маски маской изображения или изображением. Если параметр mask представляет собой маску изображения, то исходные выборки маски изображения действуют как обратное альфа-значение. То есть, если значение исходной выборки в маске изображения равно S, то соответствующий область на изображении смешивается с местом назначения, используя альфа-значение (1-S). Например, если S равно 1, область не окрашена, а если S равно 0, область полностью окрашена.

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

По какой-то причине маска изображения обрабатывается как mask image для маскировки при сохранении. Согласно:

для правильного сохранения с помощью UIImagePNGRepresentation, есть несколько вариантов:

  1. Использовать обратную версию маски изображения.
  2. Используйте «маску изображения» вместо «маски изображения».
  3. Выполните рендеринг в растровом контексте, а затем сохраните его, как упоминался эпатель.
0 голосов
/ 03 июня 2011

Вы видели этот пост? Не уверен, что это уместно, но похоже похоже

Есть идеи, почему этот код маскировки изображений не работает?

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