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

Запись маскированного изображения на диск в виде файла PNG

В основном я загружаю изображения с веб-сервера, а затем кэширую их на диск, но прежде чем сделать это, я хочу их замаскировать. Я использую код маскировки, который, как кажется, указывает на то, что можно найти здесь: 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 здесь).

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

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

4b9b3361

Ответ 1

См. описание в CGImageCreateWithMask в CGImage Reference:

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

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

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

чтобы правильно сохранить с помощью UIImagePNGRepresentation, существует несколько вариантов:

  • Используйте обратную версию маски изображения.
  • Используйте "образ маски" вместо "маски изображения".
  • Отобразить контекст растрового изображения, а затем сохранить его, например, упомянутый epatel.

Ответ 2

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

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

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