Поврежденные пиксели при объединении изображений в iOS - PullRequest
3 голосов
/ 29 августа 2011

Я пытаюсь объединить две фотографии в одно изображение (представьте себе тело с дырой в лице поверх изображения лица другого человека). Верхнее изображение имеет несколько полупрозрачных пикселей и несколько полностью прозрачных пикселей, и я хочу наложить его поверх твердого изображения.

Вот что я делаю: У меня есть контекст с правильным размером, и я рисую нижнее изображение на нем, без какой-либо альфа (faceImage). Кроме того, я рисую изображение с прозрачной дырой с различными уровнями прозрачности (coverImage):

UIGraphicsBeginImageContext(view.bounds.size);
[faceImage drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:1];
[coverImage drawAtPoint:CGPointMake(0, 0) blendMode:kCGBlendModeNormal alpha:1];
UIImage *combinedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Результаты на финальном изображении довольно неожиданны:

В пикселях, где верхнее изображение не имеет прозрачности , окончательное изображение сохраняется должным образом и показывает пиксель из верхнего изображения. ( OK )

В пикселях, где верхнее изображение имеет полную прозрачность , окончательное изображение сохраняется должным образом и показывает пиксель из нижнего изображения. ( OK )

В пикселях, где верхнее изображение имеет полупрозрачные пиксели, а яркость очень мала (яркость конечного пикселя) я неожиданно получаю полностью прозрачных пикселей (вместо конечный пиксель без прозрачности - это смесь верхнего пикселя и нижнего пикселя). (WTF?)

На изображении ниже вы можете увидеть странные пятна белого цвета. Это пиксели, которые стали полностью прозрачными (через них вы видите белый фон): The combined image with the weird transparent pixels

Это изображение, которое я помещаю сверху:

The top image with the semi transparent pixels

Это изображение лица внизу:

The face image on the bottom

Есть идеи, что может быть причиной этого?

ТИА

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

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

(возможно, это связано с оптимизированными для iPhone PNG, как описано в ссылке Одеда)

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

NSData *coverImageData = UIImagePNGRepresentation(coverImage);
coverImage = [UIImage imageWithData:coverImageData];

Как видите, мы на самом деле не сохраняем изображение в виде файла, достаточно сохранить его в виде PNG-представления и затем загрузить его обратно.

Полный взлом, но он выполняет свою работу.

2 голосов
/ 29 августа 2011

2 общих возможных отведения:

  1. Является ли изображение, которое вы рисуете, непрозрачным? (/1305509/prozrachnyi-tsvet-rabotaet-na-simulyatore-no-stanovitsya-chernym-na-iphone)
  2. Что-то насчет предварительного умножения альфа-канала (http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

Приветствия

Одед.

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