O trabalho consiste na implementacao de um programa inteiramente em assembly para a arquitetura IA32 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.
Especificacao
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++ ) {
for ( j = 0; j <
m; i++ ) {
// 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.
Exemplos de imagens:
Etapas sugeridas para o projeto e implementacao do trabalho
Desenvolver pequenos programas em assembly para Linux com o nasm de forma a se familiarizar com o processo de montagem e execucao, bem como com as chamadas de sistema do Linux.
Implementar um pequeno programa que realize uma copia de um arquivo de entrada para um novo arquivo de saida.
Implementar um programa que abra um arquivo qualquer, leia os 54 bytes iniciais, e informe se o mesmo se trata de uma imagem BMP de 24 bits sem compressao. Para isso e' necessario entender os campos do header de arquivos BMP.
Entender as explicacoes contidas no item "Especificacao" acima, procurar material extra em livros da biblioteca e/ou na Internet, e implementar o programa completo solicitado.
Entrega e avaliacao
O trabalho e' individual.
Sera' utilizado o MOSS como ferramenta auxiliar para identificacao de trabalhos copiados. Trabalhos indicados pelo MOSS como tendo alto nivel de similaridade estarao sujeitos a serem classificados como plagio, e os alunos envolvidos serao devidamente resposabilizados e penalizados.
Cada aluno devera' preparar um relatorio descrevendo as estrategias utilizadas para implementar o programa.
Serao realizadas perguntas especificas sobre os recursos e estrategias utilizadas para a implementacao do trabalho. Cada instrucao utilizada devera' ser devidamente explicada nomomento da apresentacao.
No momento da apresentacao, o aluno devera' demonstrar possuir o conhecimento necessario para o desenvolvimento de programas em assembly para a arquitetura alvo.
O alunos deverao enviar o relatorio e o programa fonte por email para Eduardo.Bezerra@pucrs.br ate' 30 minutos antes do inicio da aula do dia da apresentacao.
Programas nao recebidos por email ate' a data/hora limite nao serao avaliados (dia 29/11/2006 ate' as 7:30). Data da apresentação: 29/11/2006.