unit+ImgWrapper

Home > Delphi > TMemoLog > TStrToken > unit ImgWrapper > Download

Esta unit agrupa várias bibliotecas open source para dar suporte de leitura/escrita a vários formatos de imagens. Cada biblioteca dá suporte a um conjunto diferente de formatos de imagens e usa mecanismos e abordagens diferentes. Esta unit tenta tornar essas diferenças transparentes para o programador e fornecer uma interface simples e intuitiva para carregar ou salvar imagens.

Para cada biblioteca suportada, existe uma unit "wrapper". Esta unit encapsula a biblioteca e proporciona uma linguagem padrão para o uso dos recursos. Até o momento foram implementados wrappers para 3 bibliotecas: GraphicEx 9.9, Jasper 1.7 e Bmp2Tiff. Abaixo uma lista dos formatos suportados por cada biblioteca.

*.rpf ||=  ||=   ||=   ||   ||   || *.pic ||=  ||=   ||=   ||   ||   || *.hip ||=  ||   ||   || *.jpe *.jpeg *.jpg ||=  ||= *.jpg *.jpeg *.jpe ||= *.jpg ||  ||   || *.psd ||=  ||=   ||=   ||   ||   || *.pgm *.ppm ||=  ||=   ||=   ||   ||   || *.rgb *.rgba *.sgi ||=  ||=   ||=   ||   ||   || *.tif *.tiff ||=  ||=   ||=   ||   ||= *.tif || *.tga *.vda *.vst *.win ||= *.icb *.tga *.vda *.vst *.win ||=  ||=   ||   ||   || *.dib *.rle ||=  ||= *.bmp ||= *.bmp ||   ||   || *.emf ||=  ||= *.wmf *.emf ||= *.wmf *.emf ||  ||   || *.pcx *.scr ||=  ||= *.pcx ||= *.pcx ||   ||   ||
 * < ** Formato ** ||||= ** GraphicEx ** ||||= ** Jasper ** ||||= ** Bmp2Tiff ** ||
 * ||= . Carrega . ||= . Salva . ||= . Carrega . ||= . Salva . || . Carrega . || . Salva . ||
 * Alias/Wavefront ||= *.rla
 * Autodesk ||= *.cel
 * CompuServe ||= *.gif ||=  ||=   ||=   ||   ||   ||
 * Dr. Halo ||= *.cut ||=  ||=   ||=   ||   ||   ||
 * Encapsulated Postscript ||= *.eps ||=  ||=   ||=   ||   ||   ||
 * HIPS image ||=  ||=   ||= *.hips
 * JPG images ||= *.jfif
 * Kodak Photo-CD ||= *.pcd ||=  ||=   ||=   ||   ||   ||
 * Multiple-image Network Graphics . ||=  ||=   ||= *.mng ||= *.mng ||   ||   ||
 * Paintshop Pro ||= *.psp ||=  ||=   ||=   ||   ||   ||
 * Photoshop ||= *.pdd
 * Portable map images ||= *.pbm
 * Portable Network Graphics ||= *.png ||=  ||= *.png ||= *.png ||   ||   ||
 * SGI images ||= *.bw
 * Tagged image file format ||= *.fax
 * Truevision ||= *.icb
 * Windows bitmaps ||= *.bmp
 * Windows cursor ||=  ||=   ||= *.cur ||= *.cur ||   ||   ||
 * Windows icons ||= *.ico ||=  ||= *.ico ||= *.ico ||   ||   ||
 * Windows metafiles ||= *.wmf
 * ZSoft Paintbrush ||= *.pcc

Como usar
Para usar este sistema é bastante simples. Inclua na clausula uses do seu form principal (ou da unit que vai usar o sistema), a unit ImgWrapper, esta é a unit principal. Inclua também as units "wrappers" que desejar, cada uma delas corresponde a uma blibioteca e acrescenta vários formatos de imagens para leitura ou escrita. Tenha em mente que cada uma destas bibliotecas também acrescenta uma boa quantidade de código ao sistema. Estas units wrappers só precisam estar declaradas na cláusula uses, não é necessário acessar o código implementado nelas, todas elas já se registram automaticamente no sistema durante a inicialização.
 * . **Biblioteca** . || . **Unit wrapper** . ||
 * GraphicEx || . GrExWrapper.pas . ||
 * Jasper || . JspWrapper.pas ||
 * Bmp2Tiff || . TiffWrapper.pas ||

As classes que são manipuladas pela aplicação estão declaradas na unit principal ImgWrapper.pas. Estas classes são envoltórios que se associam a objetos já existentes e passam a controlá-los internamente. Além disso, podem ser manipuladas com um número muito reduzido de métodos, fornecendo uma interface simplificada ao máximo.

São três classes feitas para envolver respectivamente objetos das classes TBitmap, TPicture e TImage. Estes objetos já devem existir ao serem instanciadas, as classes não criam e nem destroem os objetos envolvidos. A tabela abaixo lista os métodos disponíveis em cada uma.


 * . **Objeto** . || . **Classe** . || . **Métodos / Propriedades públicos** . ||
 * **TBitmap ** || ** TBitmapWrapper ** || ** constructor Create(bmp: TBitmap); **
 *  proc LoadFromFile(FileName: string); **
 *  proc SaveToFile(FileName: string); **
 *  func PickAndLoad: boolean; **
 *  func PickAndSave: boolean; **
 *  prop LastFileName: string; ** ... **read write **
 *  prop LastFilePath: string; ** ... **read write **
 *  prop FilterToLoad: string; ** ... **read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop FilterToSave: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop bmp: TBitmap; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ........... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read ** ||
 * **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">TPicture **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;">. || **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> TPictureWrapper **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;">. || **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> constructor Create(pic: TPicture); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> proc LoadFromFile(FileName: string); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> proc SaveToFile(FileName: string); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> func PickAndLoad: boolean; **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> func PickAndSave: boolean; **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop LastFileName: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read write **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop LastFilePath: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read write **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop FilterToLoad: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop FilterToSave: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop bmp: TBitmap; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ........... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop pic: TPicture; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> .......... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read ** ||
 * **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">TImage ** || **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> TImageWrapper ** || **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> constructor Create(img: TImage); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> proc LoadFromFile(FileName: string); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> proc SaveToFile(FileName: string); **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> func PickAndLoad: boolean; **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> func PickAndSave: boolean; **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop LastFileName: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read write **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop LastFilePath: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read write **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop FilterToLoad: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop FilterToSave: string; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> . . **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop AdjustToClient: boolean; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;">. **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read write **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop bmp: TBitmap; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;">............ **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop pic: TPicture; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> .......... **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read **
 * <span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> prop img: TImage; **<span style="color: #ffffff; font-family: 'Courier New',Courier,monospace; font-size: 120%;"> ............ **<span style="color: #000080; font-family: 'Courier New',Courier,monospace; font-size: 120%;">read ** ||

O uso básico consiste em criar uma instância da classe apropriada ao objeto que será envolvido (Bitmat, Picture ou Image), carregar ou salvar a imagem e liberar a instância. Para isso não há necessidade de usar variáveis de referência, é possível usar objetos anônimos como nos exemplos abaixo: code format="pascal" procedure TForm1.btnLoadImageClick(Sender: TObject); begin with TImageWrapper.Create(Image1) do    // Image1: TImage try AdjustToClient:= true; PickAndLoad; finally Free; end; end;

procedure SaveBitmap(Bitmap: TBitmap; const Filename: string); begin with TBitmapWrapper.Create(Bitmap) do try SaveToFile(Filename); finally Free; end; end; code


 * Qual a diferença entre usar os métodos dos wrappers e usar diretamente os métodos dos objetos para salvar e carregar imagens? **

Os pacotes GraphicEx e Jasper registram os formatos que suportam no sistema gráfico do Delphi, então com os formatos suportados por estes pacotes, os métodos SaveToFile e LoadFromFile funcionarão corretamente quando chamados a partir de bitmaps, pictures e images sem o uso dos wrappers, desde que os pacotes estejam incluídos na compilação. Entretanto, alguns dos formatos não geram bitmaps nativamente (jpg por exemplo) e precisam de alguma interferência para gerar bitmaps que possam ser manipulados pelo programa. Os métodos dos wrappers cuidam de garantir que sempre haverá um bitmap disponível qualquer que seja o formato usado.

Um outro problema é que cada um dos pacotes faz seu próprio gerenciamento dos filtros para carregar e salvar arquivos. Quando os dois pacotes são combinados no mesmo programa os filtros podem ficar um tanto confusos, com formatos duplicados e outros problemas. A unit ImgWrapper cuida de manter os filtros de arquivos organizados adequadamente.