Tecnologia de conversão de formato de imagem comum Delphi (2)
Autor:lyboy99
e-mail:[email protected]
URL: http://hnh.126.com
Fornece vários métodos de conversão de formato de imagem comumente usados e suas funções de conversão
Espero que ajude você
1. Converta TxT em GIF
2. Converta o formato WMF para o formato BMP
3. Converta o formato BMP para o formato WMF
4.TBitmaps para regiões do Windows
-------------------------------------------------- --------------------------
TxT para GIF
-------------------------------------------------- ------
PRocedure TxtToGif (txt, NomeArquivo: String);
var
temp: TBitmap;
GIF: TGIFImage;
começar
temp:=TBitmap.Create;
tentar
temp.Altura :=400;
temp.Largura :=60;
temp.Transparent:=Verdadeiro;
temp.Canvas.Brush.Color:=colFondo.ColorValue;
temp.Canvas.Font.Name:=Fonte.FontName;
temp.Canvas.Font.Color:=colFuente.ColorValue;
temp.Canvas.TextOut (10,10,txt);
Imagen.Picture.Assign(nil);
GIF := TGIFImage.Create;
tentar
GIF.Assign(Temp);
//Salvar GIF
GIF.SaveToFile(NomeArquivo);
Imagen.Picture.Assign (GIF);
finalmente
GIF.Grátis;
fim;
Finalmente
temp.Destruir;
Fim;
fim;
-------------------------------------------------- -------------------
2. Converta o formato WMF para o formato BMP
-------------------------------------------------- ------------------
procedimento WmfToBmp(FicheroWmf,FicheroBmp:string);
var
MetaArquivo:TMetaquivo;
Bmp:TBitmap;
começar
Metarquivo:=TMetaFile.create;
{Criar um bitmap temporal}
Bmp:=TBitmap.create;
{Carregar o metarquivo}
MetaFile.LoadFromFile(FicheroWmf);
{Desenhe o metarquivo na tela do Bitmap}
com Bmp fazer
começar
Altura:=Metarquivo.Altura;
Largura:=Metarquivo.Largura;
Canvas.Draw(0,0,MetaArquivo);
{Salve o BMP}
SaveToFile(FicheroBmp);
{BMP grátis}
Livre;
fim;
{Metarquivo Gratuito}
MetaFile.Free;
fim;
-------------------------------------------------- -------------------
3. Converta o formato BMP para o formato WMF
-------------------------------------------------- -------------------
procedimento BmpToWmf (BmpFile,WmfFile:string);
var
MetaArquivo: TMetaFile;
MFCanvas: TMetaFileCanvas;
BMP: TBitmap;
começar
{Criar temporários}
MetaArquivo := TMetaFile.Create;
BMP := TBitmap.create;
BMP.LoadFromFile(BmpFile);
{Igualemos tama?os}
{Equalizando tamanhos}
MetaArquivo.Height := BMP.Height;
MetaArquivo.Largura := BMP.Largura;
{Crie uma tela para o metarquivo}
MFCanvas:=TMetafileCanvas.Create(MetaFile, 0);
com MFCanvas fazer
começar
{Desenhe o BMP na tela}
Desenhar(0, 0, BMP);
{Liberte a tela}
Livre;
fim;
{Liberte o BMP}
BMP.Livre;
com MetaFile faça
começar
{Salve o metarquivo}
SaveToFile(WmfArquivo);
{Liberte...}
Livre;
fim;
fim;
-------------------------------------------------- -------------------
4.TBitmaps para regiões do Windows
-------------------------------------------------- -------------------
função BitmapToRegion(bmp: TBitmap; TransparentColor: TColor=clBlack;
RedTol: Byte = 1 GreenTol: Byte = 1;
const
UnidadeAlocada = 100;
tipo
PRectArray = ^TRectArray;
TRectArray = Array[0..(MaxInt div SizeOf(TRect))-1] de TRect;
var
pr: PRectArray;
h:HRGN;
RgnData: PRgnData;
lr, lg, lb, hr, hg, hb: Byte;
x,y,x0: Inteiro;
b: PByteArray;
ScanLinePtr: Ponteiro;
ScanLineInc: Inteiro;
maxRects: Cardeal;
começar
Resultado:= 0;
{ Mantenha disponíveis os valores mais baixos e mais altos para os pixels "transparentes" }
lr := GetRValue(TransparentColor);
lg := GetGValue(TransparentColor);
lb := GetBValue(TransparentColor);
hora := Min($ff, lr + RedTol);
hg := Min($ff, lg + GreenTol);
hb := Min($ff, lb + BlueTol);
bmp.PixelFormat := pf32bit;
maxRects := AllocUnit;
GetMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects));
tentar
com RgnData^.rdh faça
começar
dwSize := SizeOf(RGNDATAHEADER);
iType := RDH_RECTANGLES;
nContagem := 0;
nRgnSize := 0;
SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
fim;
ScanLinePtr := bmp.ScanLine[0];
ScanLineInc := Inteiro(bmp.ScanLine[1]) - Inteiro(ScanLinePtr);
para y:= 0 para bmp.Height - 1 faça
começar
x := 0;
enquanto x <bmp.Largura do
começar
x0 := x;
enquanto x <bmp.Largura do
começar
b := @PByteArray(ScanLinePtr)[x*SizeOf(TRGBQuad)];
// BGR-RGB: BMPs do Windows 32bpp são feitos de quadrantes BGRa (não RGBa)
se (b[2] >= lr) e (b[2] <= hr) e
(b[1] >= lg) e (b[1] <= hg) e
(b[0] >= lb) e (b[0] <= hb) então
Break; // pixel é transparente
Inc(x);
fim;
{ teste para ver se temos uma área não transparente na imagem }
se x > x0 então
começar
{aumentar RgnData por AllocUnit rects se excedermos maxRects }
se RgnData^.rdh.nCount >= maxRects então
começar
Inc(maxRects,AlocUnit);
ReallocMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
fim;
{ Adicione o retângulo (x0, y)-(x, y+1) como uma nova área visível na região }
pr := @RgnData^.Buffer; // Buffer é um array de retângulos
com RgnData^.rdh faça
começar
SetRect(pr[nCount], x0, y, x, y+1);
{ajuste o retângulo delimitado da região se estivermos "fora dos limites" }
se x0 < rcBound.Left então rcBound.Left := x0;
se y < rcBound.Top então rcBound.Top := y;
se x > rcBound.Right então rcBound.Right := x;
se y+1 > rcBound.Bottom então rcBound.Bottom := y+1;
Inc(nContagem);
fim;
fim; // se x > x0
se RgnData^.rdh.nCount = 2000 então
começar
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects), RgnData^);
se Resultado > 0 então
start // Expande a região atual
CombineRgn(Resultado, Resultado, h, RGN_OR);
DeleteObject(h);
fim
else // Primeira região, atribua-a ao Resultado
Resultado :=h;
RgnData^.rdh.nCount := 0;
SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
fim;
Inc(x);
end; // verifica cada byte de amostra da imagem
Inc(Integer(ScanLinePtr), ScanLineInc);
fim;
{preciso ligar para ExCreateRegion mais uma vez porque poderíamos ter saído}
{ um RgnData com menos de 2.000 retângulos, portanto ainda não foi criado/combinado }
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects), RgnData^);
se Resultado > 0 então
começar
CombineRgn(Resultado, Resultado, h, RGN_OR);
DeleteObject(h);
fim
outro
Resultado :=h;
finalmente
FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
fim;
-------------------------------------------------- --------------------------------