/ / Корумпирани пиксели при комбиниране на изображения в iOS - iphone, object-c, ios, обработка на изображения

Корупционни пиксели при комбиниране на изображения в iOS - iphone, lens-c, ios, обработка на изображения

Опитвам се да комбинирам две снимки в едно изображение(Помислете за тяло с дупка в лицето на снимката на лицето на различен човек). Горното изображение има някои полупрозрачни пиксели и някои напълно прозрачни пиксели и искам да го насложа върху твърдо изображение.

Ето какво правя: Имам контекст с правилния размер и рисувам най-долното изображение върху него, без алфа (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();

Резултатите в крайното изображение са доста неочаквани:

В пиксели, където top image няма прозрачност крайното изображение се запазва правилно и показва пиксела от най-горното изображение. (Добре)

В пиксели, където top image има пълна прозрачност крайното изображение се запазва правилно и показва пиксела от дъното на изображението. (Добре)

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

В изображението по-долу можете да видите странни петна от бяло. Това са пикселите, които са станали изцяло прозрачни пиксели (виждате бял фон през тях): Комбинираното изображение с странните прозрачни пиксели

Това е изображението, което поставям отгоре:

Най-горното изображение с полупрозрачни пиксели

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

Изображението на лицето на дъното

Какви идеи може да причини това?

TIA

Отговори:

2 за отговор № 1

2 основни възможни начина:

  1. Виждате ли изображението, което нарисувате непрозрачно?
  2. Нещо за това, че алфа каналът се умножава предварително (http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)

Наздраве,

Одед.


2 за отговор № 2

Никога не сме открили какво причинявапроблем, но се намери, че когато промените яркостта на полу-прозрачен образ в приложението и да го запишете, проблемът възниква. Ако предварително зареждате изображение, което е светло, проблемът не се появява.

(Възможно е това да е свързано с оптимизирани PNG файлове на iPhone, както е описано в връзката на Oded)

За да решим проблема, ние временно запазваме изображението, след като яркостта се промени и след това използваме запазеното изображение за крайната смес. Ето кода, който добавихме:

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

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

Пълна рана, но върши работата.