Blend Mode
Alpha
@brunomacabeusbr
@davidsilvam
#ifce
Blend mode? Alpha?
Imagens tiradas de http://ssp.impulsetrain.com/porterduff.html
Como unir essas duas imagens?
E com o modo alpha?
+
=
Objetivo
Criar um código em C para blendar com alpha duas imagens, cumprindo os requisitos da plataforma ARM
Algoritmo
Duas imagens .ppm de dimensões n * m
União das imagens por composição alpha
retorna
if (widthImgSour > posX && heightImgSour > posY) {
fputc((char) (mapPixelsDest[posY][posX][0] * ad + mapPixelsSour[posY][posX][0] * as * (1 - ad)), fp);
fputc((char) (mapPixelsDest[posY][posX][1] * ad + mapPixelsSour[posY][posX][1] * as * (1 - ad)), fp);
fputc((char) (mapPixelsDest[posY][posX][2] * ad + mapPixelsSour[posY][posX][2] * as * (1 - ad)), fp);
} else {
fputc(mapPixelsDest[posY][posX][0], fp);
fputc(mapPixelsDest[posY][posX][1], fp);
fputc(mapPixelsDest[posY][posX][2], fp);
}
Estruturas de dados
P1
P2
P3
P4
P5
P6
3 canais de cores: RGB
mapa de pixels em binário
Por qual razão o P6?
Aplicação
Anti-aliasing (Alpha to coverage)
Game: The Saboteur
Dificuldades
Leitura do mapa de pixels
unsigned char mapPixelsDest[heightImgDest][widthImgDest][3];
fseek(fp, 4, SEEK_CUR);
for (posX = 0, posY = -1; posX != widthImgDest + 1 && posY != 78; posX++) {
posX %= widthImgDest;
if (posX == 0) {
posY += 1;
}
fread(&mapPixelsDest[posY][posX][0], sizeof(char), 1, fp);
fread(&mapPixelsDest[posY][posX][1], sizeof(char), 1, fp);
fread(&mapPixelsDest[posY][posX][2], sizeof(char), 1, fp);
}
Resultado obtido
+
=
Aprendizado
Formato de arquivo PPM
Aplicação do alpha
Melhorar o algoritmo
Não armazenar o mapa de pixels numa variável,
mas sim apenas usar o ponteiro dos arquivos
Bibliografia
http://graphics.cs.ucdavis.edu/~joy/ecs277/other-notes/Alpha-Blending.pdf
https://www.w3.org/TR/2013/WD-compositing-1-20130625/
http://ssp.impulsetrain.com/porterduff.html
Blend Mode - Alpha (ARM)
By brunomacabeus
Blend Mode - Alpha (ARM)
- 605