# ColorSpaces

### RGB Colorspaces

Há vários formatos RGB, mas os dois amplamente usados são conhecidos como RGB24 e RGB32.

Todos eles contêm três componentes, R,G e B – em resumo Vermelho (Red), Verde (Green) e Azul (Blue).

RGB24 e RGB32 são ambos InterleavedImageFormat. A única diferença entre os dois é que RGB32 contém um byte extra para cada píxel.

O extra byte que RGB32 contém é conhecido como um píxel alfa, mas realmente é usado muito raramente. A razão que RGB32 é considerado o "melhor" formato é puramente a visão de alguns programadores. Controlar material RGB32 é muito mais fácil que RGB24, porque a maioria dos processadores operam em 32bits, e não 24.

### YUY2 Colorspace

YUY2 também é um InterleavedImageFormat. Os bytes são organizados na memória assim:

`YUYV|YUYV|YUYV|YUYV|YUYV|YUYV|...`

`^primeiro byte na linha.`

Assim cada píxel compartilha informação UV (croma) horizontal com um píxel vizinho.

### YV12 Colorspace

O colorspace YV12 é muito diferente dos colorspaces RGB e YUY2. A diferença principal é o PlanarImageFormat. Isso significa que os componentes de cores diferentes ficam separados na memória.

Isto pode na maioria dos casos dar uma velocidade substancial, desde todos os bytes de cada plano pode ser tratado do mesmo modo. Também pode acelerar porque seu filtro não tem que trabalhar em todos os planos, se modificar só um ou dois deles.

Todas as imagens são determinadas num lance. O lance é basicamente o que pode ser descrito como "comprimento de uma linha". O engraçado é que o lance não tem que ser igual à largura da imagem.

Por exemplo, se você apara algo da sua imagem, a única coisa que muda é a largura da imagem; o lance e a conta de byte de uma linha atual permanecem o mesmo.

A imagem então é disposta assim:

rrrrrrrrrrrrrrrrpppp

rrrrrrrrrrrrrrrrpppp

rrrrrrrrrrrrrrrrpppp

Onde os 'r' são os píxeis na imagem usada, e 'p' é o enchimento inserido depois de cada linha.

Em YV12 o plano Y tem sempre uma conta de byte que é múltiplo de 16, mas ainda é possível ter imagens na largura de mod2, porque o tamanho da linha é diferente do lance. Os planos UV sempre têm igualmente um lance múltiplo de 8.

Quando você pede quadro ->GetRowSize(PLANAR_Y) você terá o tamanho da linha dos píxeis na imagem. Quando você pede quadro ->GetRowSize(PLANAR_Y_ALIGNED) você SEMPRE terá um tamanho de linha múltiplo de 16 (múltiplo de 8 em planos UV).

A razão para usar lance para obter de uma linha a outra é que o lance pode ser até maior que o tamanho da linha alinhado - por exemplo depois de um aparo.

Assim o que você deve fazer é:

- Obter um tamanho de linha.

- Para cada linha na imagem:

- Processar os (alinhados) píxeis do tamanho da linha.

- Saltar para a próxima linha, colocando lance para o plano atual.

#### Entrelaçando YV12

YV12 controla croma interlaçado diferentemente de YUY2, desde YV12 só contém informação de croma para cada segunda linha.

Para habilitar o entrelaçamento, croma é esticado por duas linhas luma no mesmo campo! Isso significa que luma e croma não são diretamente mapeáveis para luma linha/2 e luma linha/2+1 como um quadro baseado em imagens.

linha 0: Croma para linhas luma entrelaçadas 0+2

linha 1: Croma para linhas luma entrelaçadas 1+3

linha 2: Croma para linhas luma entrelaçadas 4+6

linha 3: Croma para linhas luma entrelaçadas 5+7

...etc!

Quando se vê as linhas individuais em cada plano isto mapeia:

Considere os planos separados:

Luma:

`L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1L1`

`L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2L2`

`L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3L3`

`L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4L4`

Croma que mapeia para luma no plano acima:

`C1C1C1C1C1C1C1C1C1C1C1`

`C2C2C2C2C2C2C2C2C2C2C2`

Desde luma L1 e L3 estão no mesmo campo, a informação croma em C1 é usada para estas linhas e NÃO linha L1 + L2 como quando a imagem é baseada em quadro. C2 é usado para linhas 2+4 e assim por diante.

Isto é algo que desentrelaçadores e programas semelhantes precisam levar em conta. Outros filtros podem confiar no uso de Separatefields() e Weave(), para produzir imagens baseadas em quadro. Você pode usar VideoInfo.IsFieldBased() para conferir sua fonte e talvez decidir em lançar um erro, ou trocar para outro modo de processo.

Se o vídeo é baseadas em campo, sua resolução vertical (altura) deve ser divisível antes por 4, caso contrário AviSynth não criará um quadro de vídeo novo, mas emitirá um erro.

### Links

Veja mais sobre DataStorageInAviSynth.

Veja uma introdução geral em WorkingWithImages

`$Date: 2006/03/26 18:11:19 $ Portuguese translation by RoLon`