Опитвам се да комбинирам две снимки в едно изображение(Помислете за тяло с дупка в лицето на снимката на лицето на различен човек). Горното изображение има някои полупрозрачни пиксели и някои напълно прозрачни пиксели и искам да го насложа върху твърдо изображение.
Ето какво правя: Имам контекст с правилния размер и рисувам най-долното изображение върху него, без алфа (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 за отговор № 12 основни възможни начина:
- Виждате ли изображението, което нарисувате непрозрачно?
- Нещо за това, че алфа каналът се умножава предварително (http://iphonedevelopment.blogspot.com/2008/10/iphone-optimized-pngs.html)
Наздраве,
Одед.
2 за отговор № 2
Никога не сме открили какво причинявапроблем, но се намери, че когато промените яркостта на полу-прозрачен образ в приложението и да го запишете, проблемът възниква. Ако предварително зареждате изображение, което е светло, проблемът не се появява.
(Възможно е това да е свързано с оптимизирани PNG файлове на iPhone, както е описано в връзката на Oded)
За да решим проблема, ние временно запазваме изображението, след като яркостта се промени и след това използваме запазеното изображение за крайната смес. Ето кода, който добавихме:
NSData *coverImageData = UIImagePNGRepresentation(coverImage);
coverImage = [UIImage imageWithData:coverImageData];
Както виждате, ние всъщност не запазваме изображението като файл, достатъчно е да го съхраним като PNG представяне и след това да го заредим обратно.
Пълна рана, но върши работата.