O trabalho consiste na implementacao de um programa inteiramente em assembly para a arquitetura 80x86 para realizar a conversao de uma imagem colorida para tons de cinza. Devera' ser utilizado, obrigatoriamente, o sistema operacional Linux. O programa devera' receber como entrada um arquivo BMP com 24 bits de resolucao, nao compactado, e fornecer como saida um arquivo BMP equivalente, porem com a imagem convertida para tons de cinza. A verificacao do correto funcionamento do programa sera' realizada ao se abrir a imagem BMP gerada em um visualizador de imagens BMP. A seguir estão listadas algumas dicas e material de apoio:
O programa devera' abrir o arquivo de entrada e ler o header de 54 bytes de forma a verificar se a imagem contida no arquivo esta' realmente no formato BMP de 24 bits e sem compressao. Em uma imagem BMP sem compressao, cada tres bytes lidos, a partir do header, representa um pixel da imagem, sendo o primeiro byte a cor azul (Blue), o segundo byte a cor verde (Green), e o terceiro byte a cor vermelha (Red). Uma forma de converter um determinado pixel (tres bytes) para tons de cinza, utiliza a seguinte formula: Luminosidade = B * 0.11 + G * 0.59 + R * 0.3 onde B e' o primeiro byte (Blue), G o segundo (Green), e R o terceiro (Red). O valor resultante contido na variavel "Luminosidade" devera' ser atribuido para os tres bytes que compoem o pixel em questao, de forma a gerar a nova imagem em tons de cinza. A imagem composta pelos pixels RGB (bytes contados de 3 em 3 apos o header) esta' organizada na forma de uma matriz n x m. O numero de linhas n dessa matriz (numero de linhas da imagem) pode ser obtido na posicao 22 do header, e o numero de bytes em cada linha (cada 3 bytes e' um pixel RGB) pode ser obtido na posicao 18 do header do arquivo BMP. No final de cada linha podem existir bytes de preenchimento que nao fazem parte da imagem. Estes bytes nao podem ser convertidos, e devem ser copiados diretamente para o arquivo de saida. O numero de bytes a serem saltados por linha e' obtido a partir da seguinte equacao: nr_bytes = ( tamanho_total_do_arquivo - (largura * altura * 3 + 54) ) / altura Para varrer todos os bytes que compoem todos os pixels da imagem, podera' ser utilizado uma construcao do tipo: for ( i = 0; i < n; j++ ) { // realizar a conversao dos pixels e a escrita no arquivo de saida } if ( nr_bytes > 0 ) // ler os bytes; e escrever diretamente no arquivo de saida sem processamento. } Em resumo, o programa devera' aceitar como arquivo de entrada uma imagem BMP de 24 bits colorida sem compressao, e fornecer como saida um novo arquivo contendo a imagem BMP equivalente em tons de cinza, tambem de 24 bits sem compressao.
|
||||||||||