#### 4.3.2 Objetos de imagem

Objetos de imagem são usados para especificar dados de pixmap ou para texturas (Veja Mapeamento de Textura), ou para imagens de fundo de câmeras (Veja Objetos de camera).

Ao mesmo tempo em que imagens são escritas elas são também comprimidas de 1 a 4 canais, um canal fornece um número simples no intervalo que vai de 0 a `maxval` para cada ponto de imagem (pixel); e `maxval` é colocado em 255. A interpretação dos dados de imagem dependente do número de canais é como segue:

#Canais | No. do Canal | Interpretação
--- | --- | ---
1 | 1 | escala de cinza ou dados de luminância
2 | 1 | escala de cinza ou dados de luminância
| 2 | canal alfa (0: transparente, `maxval`: opaco)
3 | 1 | canal vermelho
| 2 | canal verde
| 3 | canal azul
4 | 1 | canal vermelho
| 2 | canal verde
| 3 | canal azul
| 4 | canal alfa (0: transparente, `maxval`: opaco)

Dados de imagem podem ser especificados inline (embutidos dentro do fluxo de dados atual) ou via referências de arquivos; em ambos os casos os dados são lidos e interpretados ao mesmo tempo que o objeto de imagem é passado. Essa forma é diferente da antiga (e desatualizada) forma de especificação de textura de imagem, onde os dados de imagem em uma mídia podem eventualmente serem re-lidos pelo Geomview.

A sintaxe geral de objetos de imagem é como segue:

         <image> ::=
           [ "{" ]             (abertura de chave, geralmente precisam informar
                                o fim do objeto de forma clara.)
           [ "image" ]          (palavra chave opcional; desnecessária se o tipo
                                é determinado pelo contexto, o que
                                usualmente acontece.)
           [ "define" <nome> ]
                                (define uma imagem chamada <nome>, escolhendo
                                seus valores a partir do material adiante)
           |
               "<" <nomedearquivo>   (significando: leia a imagem de contida
                                em nomedearquivo)
           |
               ":" <nome>       (significando: use a variável nome,
                                definida em algum lugar; se a variável não
                                for definida em algum lugar a imagem
                                é tida como vazia)
           |
                                (material atual de definição de imagem; dados
                                da imagem obrigatóriamente vêm por ultimo,
                                após a definição da largura e da altura
                                e do número de canais)

               "width"          (largura da imagem, detectado automaticamente
                                a partir dos dados da imagem se possível)

               "height"         (altura da imagem, detectado automaticamente
                                a partir dos dados da imagem se possível)

               "channels"       (número de canais, detectado automaticamente
                                a partir dos dados da imagem e a partir das
                                especificações data descrita
                                adiante, se possível)

               "maxval"         (não suportado, obrigatoriamente deve ser 255 se
                                especificado)

               "data MASCDEST [FILTER] [{] < NOMEDOARQUIVO [}]"
               "data MASCDEST [FILTER] TAMAN_IMAGEM [{][\n]DADOS_LIT_IMAGEM[}]"
                                (dados de imagem ou externos ou embutidos,
                                veja abaixo para uma descrição detalhada do
                                significado de MASCDEST e FILTER. Uma imagem
                                pode -e tem, em geral- multiplas seções de
                                dados.)

           [ "}" ]             (fechamento correspondente da chave)

Detalhes relativos à especificação dos dados de uma imagem:

‘`MASCDEST`’
  Esse é um campo-bit descrevendo onde os dados da imagem especificada devem ser colocados no pixmap de destino. O campo-bit é especificado por meio de um inteiro em um dos formatos conhecidos (decimal, octal, hexadecimal). Os canais dos dados fonte são sempre enumerados consecutivamente. Se, e.g. ‘`NOMEDOARQUIVO`’ ou ‘`DADOS_LIT_IMAGEM`’ especificam um imagem (provavelmente RGB ...) de três canais e ‘`MASCDEST`’ for igual a `0xD` (i.e. o primeiro bit é 0), então o terceiro canal do pixmap fonte pode ser substituído no quarto canal do objeto imagem de destino (o canal alfa), o segundo canal pode determinar o valor de destino ‘`azul`’ e o primeiro canal da fonte determina o valor de destino correspondente ao ‘`vermelho`’.

  O número de canais dos dados fontes sempre tem que coincidir com o número de bits especificado como ‘`MASCDEST`’. Exceção: se o pixmap fonte possui somente um canal, então o número de canais dos dados fonte pode ser usado para preencher qualquer número de canais de destino; todos os canais especificados em ‘`MASCDEST`’ são preenchidos com os dados do canal simples do pixmap fonte.

  Geomview conhece as seguintes constantes simbólicas, que podem ser usadas em lugar de especificar o campo-bit ‘`MASCDEST`’ numericamente:

  `LUMINANCE`
    o mesmo que ‘`1`’, ‘`0x1`’, ‘`\01`’
  `LUMINANCE_ALPHA`
    o mesmo que ‘`3`’, ‘`0x3`’, ‘`\03`’
  `RGB`
    o mesmo que ‘`7`’, ‘`0x7`’, ‘`\07`’
  `RGBA`
    o mesmo que ‘`15`’, ‘`0xf`’, ‘`\017`’
  `ALPHA`
    dependendo do contexto: o número absoluto de canais deve obrigatoriamente ser conhecido; i.e. ‘`data ALPHA ...`’ deve obrigatoriamente ser colocado antes de alguma coisa de forma a determinar o número de canais da imagem, e.g.

                       ...
                       data RGB ...
                       data ALPHA
                       ...

    é válido, mas

                       <nenhumoutrocanalouespecificaçãodedadosdeimagem>
                       data ALPHA ...
                       <todo o resto ...>

    não é válido, porque Geomview não tem meios de determinar o canal de destino a partir do contexto.

  `AUTO`
    Dados de imagem no formato PGM é interpretado como canal simples em escala de cinza, dados RGB PNM como dados de imagem RGB. `AUTO` não pode trabalhar com dados de imagem no formato ‘`raw`’.
‘`FILTER`’
  A especificação ‘`FILTER`’ é opcional. se for omitida, então Geomview tenta determinar o tipode imagem usando o sufixo de ‘`NOMEDOARQUIVO`’. Se ão houver sufixo ou o sufixo for desconhecido, ou para dados embutidos de imagem, Geomview está apto a auto-detectar o formato do arquivo de imagem SGI (por razões históricas ...) e formatos de imagem NetPBM (por razões práticas). A auto-detecção de formatos NetPBM incluem o novo formato de imagem PAM que permite (em meio a um monte de outras coisas) armazenar um canal alfa juntamente com os dados de luminânica ou de RGB. Da mesma forma, a saída final de qualquer dos filtros especificados devem ou ser no formato de arquivo de imagem SGI, ou especificar uma imagem PAM, PNM ou PGM. Se o formato de arquivo de imagem não puder ser determinado por ou pelo sufixo do nome de arquivo ou pela especificação de filtro ou pela auto-detecção de dados SGI ou NetPBM, então Geomview assume que os dados sejam "raw". Veja abaixo.

  Os filtros de descompressão podem ser deduzidos ou de um dos formatos de imagem conhecidos ou de um especificador de filtro explícito, e.g. o seguinte é válido:

                data LUMINANCE raw.gzip { < arquivoemtonsdecinzagzipado }

  A linha acima deve ser equivalente a

                data LUMINANCE raw { < arquivoemtonsdecinza },

  fornece dados descomprimidos realizados através de dados de canal simples, com o primeiro pixel correspondendo ao canto inferior esquerdo (devido ao formato ‘`raw`’ de imagem, veja abaixo).

  Geomview tem conhecimento interno dos seguintes filtros/sufixos:

  Descompressão de Dados
    ‘`z`’
    ‘`gz`’
    ‘`gzip`’
      os dados são direcionados por ‘`gzip -dc`’
    ‘`bz2`’
    ‘`bzip2`’
      os dados são direcionados por ‘`bzip2 -dc`’
  Formatos de Imagem
    ‘`tiff`’
    ‘`tif`’
      Formato de imagem `TIFF`. Somente suportado se o executável `tifftopnm` puder ser executado no caminho de execução atual.
    ‘`png`’
      Formato de imagem `PNG`. Somente suportado se o executável `pngtopnm` puder ser executado no caminho de execução atual.
    ‘`jpg`’
    ‘`jpeg`’
      Formato de imagem `JPEG`. Somente suportado se o executável `jpegtopnm` puder ser executado no caminho de execução atual.
    ‘`gif`’
      Formato de imagem `GIF` image file format. Somente suportado se o executável `giftoppm` puder ser executado no caminho de execução atual.
    ‘`raw`’
      Dados de imagem em Raw; o número de canais deve coincidir com o número de bits informado em ‘`MASCDEST`’. Pixels são especificados com 1 byte por canal. Os pixels são organizados em linhas como em ‘`liminance[-alpha]`’ ou em amostras ‘`RGB[A]`’. O pixel mais à esquerda é o primeiro pixel em cada linha de dados, a linha de dados mais acima deve vir primeiramente (isso é apenas o mesmo que a convenção de NetPBM, os sistemas de coordenadas de imagem têm sua orígem no canto superior esquerdo, da forma usual).
  Filtros Explicitamente Especificados
    Se nenhum dos sufixos especificados acima coincidirem, então o sufixo/filtro é interpretado como um filtro de programa externo; o programa do filtro externo deve ler de `STDIN` (da entrada padrão) e escrever para `STDOUT` (a saída padrão). A saída deve ou ser no formato de imagem SGI, ou no formatos de image PNM ou PGM. De outra forma os dados de saída são interpretados como dados de imagem no formato raw (veja acima).

    Alguma coisa como o seguinte pode trabalhar, garantindo que o programa `${HOME}/bin/bububfilter` exista, seja executável e faça alguma coísa útil:

                       ...
                       data RGB "${HOME}/bin/bububfilter.bzip2" 7
                       { # dados binários seguem
                       bububub
                       }
                       ...

    Note que – previamente fornecendo os dados para ‘`bububfilter`’ – Geomview irá tentar descompactar o material com ‘`bzip2 -dc`’.

Omitindo dados de imagem: Normalmente, o número de canais de imagem é determinado automaticamente a partir das especificações dos `dados` de imagem; se a especificação de imagem carrega um número explícito de canais via palavra chave `channels` que excede o número de canais encontrado nas especificações de `dados`, ou se a união de todas as especificações ‘`MASCDEST`’ possuem buracos, então omitindo luminância e canais RGB são initializados para 0, e um canal alfa omitido é inicializado para `maxval`, i.e. omitindo os dados do canal alfa para uma imagem RGBA é apenas o mesmo que definir uma imagem RGB.