BMP writer
por zecomeia
Introdução
Método implementado na classe IO para escrever um arquivo de imagem do tipo bmp truecolor de 24bits a partir de um objeto da classe Bitmap usada no RGSS.
Características
- bmp truecolor 24bits
- resolução vertical e horizontal de 96dpi
- utiliza um objeto da classe Bitmap do RGSS para gerar o arquivo de imagem
Como Usar
*Ao abrir o arquivo para a escrita, use o modo BINÁRIO.
file = File.new('image.bmp','wb')
Para gravar a imagem no arquivo, use o metodo bmp_write após abrir o arquivo.
file.bmp_write(aBitmap_obj)
Feche o arquivo.
file.close
OBS: A escrita é um pouco demorada, dependendo tamanho da imagem pode levar alguns segundos. Veja a técnica de uso do script a seguir para resolver o problema.
Usando o BMP writer num processor paralelo
O script não utliza bibliotecas externas. Foi escrito totalmente em Ruby baseando-se no objeto Bitmap usado em RGSS/2. Mesmo sendo feito para ter um bom desempenho com relação ao tempo de escrita de arquivo, para empregá-lo em jogos o tempo de escrita pode acabar sendo longo. Por exemplo, em uma máquina com Core 2 Duo o script levou 2 segundos para gravar um bitmap de 640x480, o que parece rápidos, mas pode ser um incmodo no meio de um jogo.
Então resolvi usar o metodo de escrita em um processo paralelo para não ocorrer aquela pausa no jogo enquanto a gravação do arquivo está em andamento. O problema é que leva mais tempo para o arquivo ser salvo(seguindo mesmo exemplo anterior, levou 1 minuto e meio para a gravação), isso significa que não é possível visualizar/utilizar o arquivo gerao enquanto não terminar essa gravação, e também caso o jogo seja fechado antes do término o arquivo fica corrompido.
Para criar nosso processo paralelo usaremos uma Thread. Basicamente uma thread é um bloco de código que é executado em paralelo com o programa principal. A técnica não é muito complicada nem ocupa muito espaço. Primeiro vamos carregar um Bitmap para usar na gravação:
data_system = load_data("Data/System.rxdata")
aBitmap_obj = RPG::Cache.title(data_system.title_name)
As linhas acima irão carregar a imagem de título na variável aBitmap_obj.
Agora vamos à Thread:
thread_bmp = Thread.new(aBitmap_obj) do
begin
file = File.new('image.bmp','wb')
file.bmp_write(aBitmap_obj)
file.close
rescue
print 'Erro ao gravar um bitmap'
end
end
a linha:
thread_bmp = Thread.new(aBitmap_obj) do
Cria nossa Thread. Observe que já passamos como argumentoda Thread o Bitmap que criamos antes. O "do" define o nosso bloco de código que termina no último "end".
O "begin" é um outro bloco que criei dentro da threadsó para poder usar o tratamentos de exceções(erros) da clausula "rescue". Isso porque quando ocorre um erro dentro da Thread o Game.exe fecha sem nem um aviso. Então se acontecer algum erro na Thread o que está entre o recue e o end será executado. No exemplo só cooquei uma mensagem, o que não é muito correto, porque se aconteceu algum erro a thread para mas o programa continua sem tratar do problema.
Entre o begin e o rescue deve entrar aquelas três linhas que já usavamos para gravar o arquivo antes.
file = File.new('image.bmp','wb')
file.bmp_write(aBitmap_obj)
file.close
Abre o arquivo para leitura, escreve o BMP no arquivo e fecha o arquivo quando terminar a escrita.
Basicamente é isso. Teste a técnica e qualquer dúvida fique a vontade.
Script
Créditos e Agradecimentos
- Feito por zecomeia
Nenhum comentário:
Postar um comentário