quinta-feira, 3 de maio de 2012

Lazarus Pascal - TLazIntfImage - Manipulando Bitmaps - I

No Lazarus uma classe especialmente concebida manipula o mapa de pixels:

TLazIntfImage

Isto ocorre porque a classe TBitmap não manipula, incompreensivelmente, pixels.

Carregando uma imagem

Um objeto desta classe não carrega por suas próprias forças uma imagem. É preciso utilizar a classe TBitmap como auxiliar.

Declaração de variáveis

Escreva o seguinte bloco de declaração de variáveis:


var
   x, y: Integer;
   px, py: Integer;
   oBmp: TBitmap;
   ImgHandle,ImgMaskHandle, MskHandle: HBitmap;
   SrcIntfImg, TempIntfImg: TLazIntfImage;

Carrendo os bitmaps para serem manipulados


     oBmp := TBitmap.Create;
     oBmp.PixelFormat:=pf32bit;
     oBmp := Img1.Picture.Bitmap;

O formato de armazenamento de pixels deverá ser de 32 bits, para conservar a melhor qualidade possível do bitmap (pf32bit) . Um controle Image (Img1) será usado como buffer dos resultados intermediários das alterações que vamos fazer. É bem melhor que manipular as poderosas streams, pois dão apenas um terço de suas dores de cabeça.

O importante aqui é que na terceira instrução oBmp contém o Bitmap (mapa de bits) da imagem que está no controle Image. Em algum lugar este controle foi carregado com um Bitmap (tem que ser um bitmap de arquivo bmp ou de um JPG convertido para bitmap).

Carregando um bitmap com um arquivo BMP

oBmp.LoadFromFile('C:\ _____ .bmp');

Mas o que acontece frequentemente é que carregamos a região bitmap a partir de um JPG, menor e mais consagrado como padrão na Internet. Como fazer ?

Carregando um arquivo JPG

Declaramos uma variável do tipo TJPEGImage no bloco var:

oJPG:TJPEGImage;

Executamos as instruções de instanciação e de carregamento de um JPG:


    oJPG:=TJPEGImage.Create;
    oJPG.LoadFromFile( 'C:\ _____ .jpg' );

Mas agora estamos numa sinuca. O tipo para manipulação de pixels é BMP e não JPG.

Transformando um JPG num BMP


Utilize a seguinte sequência de instruções:


    oJPG:=TJPEGImage.Create;
    oJPG.LoadFromFile(  'C:\ _____ .jpg' );
    oBmp:=TBitmap.Create;
    oBmp.Width:=Largura;
    oBmp.Height:=Altura;
    oBmp.Canvas.StretchDraw(Rect(0,0,oBmp.Width-1,oBmp.Height-1),oJPG);
    oJPG.Assign(oBmp);
    oJPG.CompressionQuality:=100;



A variável oJPG contém o conteúdo trazido cru do arquivo JPG. Criamos um TBitmap e carregamos o seu canvas (superfície de desenho) com o JPG contido em oJPG. E ainda podemos descarregar a figura num retângulo pré-dimensionado. No caso, descarregamos num retângulo de Altura e Largura conhecidos, e provavelmente proporcionais às medidas originais da figura.

Carregando para a classe TLazIntfImage

Uma vez obtido o bitmap, fica fácil obter uma imagem de pixels manipuláveis TLazIntfImage:


     SrcIntfImg:=TLazIntfImage.Create(0,0);
     SrcIntfImg.LoadFromBitmap(oBmp.Handle,oBmp.MaskHandle);

 ImgHandle e ImgMaskHandle foram declaradas no início deste post como handles HBitmap do sistema operacional. Estes handles apontam para o bitmap carregado..

De agora em diante,o bitmap está em SrcIntfImg em um formato de pixels individuais e manipuláveis..

Vamos declarar mais duas instruções:


     TempIntfImg:=TLazIntfImage.Create(0,0);
     TempIntfImg.LoadFromBitmap(oBmp.Handle,oBmp.MaskHandle);

TempIntfImg será um rascunho, para não danificarmos a imagem original SrcIntfImg.

No próximo post vamos manipular os pixels.







Nenhum comentário:

Postar um comentário