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