Gemeinsame Bildformatkonvertierungstechnologie von Delphi (2)
Autor:lyboy99
E-Mail:[email protected]
URL: http://hnh.126.com
Stellen Sie mehrere häufig verwendete Methoden zur Konvertierung von Bildformaten und deren Konvertierungsfunktionen bereit
Ich hoffe, es hilft dir
1. Konvertieren Sie TxT in GIF
2. Konvertieren Sie das WMF-Format in das BMP-Format
3. Konvertieren Sie das BMP-Format in das WMF-Format
4.TBitmaps zu Windows-Regionen
-------------------------------------------------- --------------------------
TxT zu GIF
-------------------------------------------------- ------
PROcedure TxtToGif (txt, FileName: String);
var
temp: TBitmap;
GIF: TGIFImage;
beginnen
temp:=TBitmap.Create;
versuchen
temp.Höhe :=400;
temp.Width :=60;
temp.Transparent:=True;
temp.Canvas.Brush.Color:=colFondo.ColorValue;
temp.Canvas.Font.Name:=Fuente.FontName;
temp.Canvas.Font.Color:=colFuente.ColorValue;
temp.Canvas.TextOut (10,10,txt);
Imagen.Picture.Assign(nil);
GIF := TGIFImage.Create;
versuchen
GIF.Assign(Temp);
//GIF speichern
GIF.SaveToFile(FileName);
Imagen.Picture.Assign (GIF);
Endlich
GIF.Free;
Ende;
Endlich
temp.Destroy;
Ende;
Ende;
-------------------------------------------------- -------------------
2. Konvertieren Sie das WMF-Format in das BMP-Format
-------------------------------------------------- -------------------
procedure WmfToBmp(FicheroWmf,FicheroBmp:string);
var
MetaFile:TMetafile;
Bmp:TBitmap;
beginnen
Metafile:=TMetaFile.create;
{Eine temporäre Bitmap erstellen}
Bmp:=TBitmap.create;
{Laden Sie die Metadatei}
MetaFile.LoadFromFile(FicheroWmf);
{Zeichnen Sie die Metadatei im Bitmap-Canvas}
mit Bmp tun
beginnen
Höhe:=Metafile.Height;
Breite:=Metafile.Width;
Canvas.Draw(0,0,MetaFile);
{Speichern Sie das BMP}
SaveToFile(FicheroBmp);
{Kostenloses BMP}
Frei;
Ende;
{Kostenlose Metadatei}
MetaFile.Free;
Ende;
-------------------------------------------------- -------------------
3. Konvertieren Sie das BMP-Format in das WMF-Format
-------------------------------------------------- -------------------
procedure BmpToWmf (BmpFile,WmfFile:string);
var
MetaFile: TMetaFile;
MFCanvas: TMetaFileCanvas;
BMP: TBitmap;
beginnen
{Tempos erstellen}
MetaFile := TMetaFile.Create;
BMP := TBitmap.create;
BMP.LoadFromFile(BmpFile);
{Igualemos tama?os}
{Größenausgleich}
MetaFile.Height := BMP.Height;
MetaFile.Width := BMP.Width;
{Erstellen Sie eine Leinwand für die Metadatei}
MFCanvas:=TMetafileCanvas.Create(MetaFile, 0);
mit MFCanvas tun
beginnen
{Zeichne das BMP in die Leinwand}
Draw(0, 0, BMP);
{Befreie die Leinwand}
Frei;
Ende;
{Befreie das BMP}
BMP.Frei;
mit MetaFile tun
beginnen
{Speichern Sie die Metadatei}
SaveToFile(WmfFile);
{Befreie es...}
Frei;
Ende;
Ende;
-------------------------------------------------- -------------------
4.TBitmaps zu Windows-Regionen
-------------------------------------------------- -------------------
function BitmapToRegion(bmp: TBitmap; TransparentColor: TColor=clBlack;
RedTol: Byte=1; GreenTol: Byte=1; BlueTol: Byte=1): HRGN;
const
AllocUnit = 100;
Typ
PRectArray = ^TRectArray;
TRectArray = Array[0..(MaxInt div SizeOf(TRect))-1] of TRect;
var
pr: PRectArray;
h:HRGN;
RgnData: PRgnData;
lr, lg, lb, hr, hg, hb: Byte;
x,y,x0: Ganzzahl;
b: PByteArray;
ScanLinePtr: Zeiger;
ScanLineInc: Ganzzahl;
maxRects: Kardinal;
beginnen
Ergebnis := 0;
{ Halten Sie die niedrigsten und höchsten Werte für die „transparenten“ Pixel bereit. }
lr := GetRValue(TransparentColor);
lg := GetGValue(TransparentColor);
lb := GetBValue(TransparentColor);
hr := 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));
versuchen
mit RgnData^.rdh tun
beginnen
dwSize := SizeOf(RGNDATAHEADER);
iType := RDH_RECTANGLES;
nCount := 0;
nRgnSize := 0;
SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
Ende;
ScanLinePtr := bmp.ScanLine[0];
ScanLineInc := Integer(bmp.ScanLine[1]) - Integer(ScanLinePtr);
für y := 0 bis bmp.Height - 1 do
beginnen
x := 0;
while x < bmp.Width do
beginnen
x0 := x;
while x < bmp.Width do
beginnen
b := @PByteArray(ScanLinePtr)[x*SizeOf(TRGBQuad)];
// BGR-RGB: Windows 32bpp BMPs bestehen aus BGRa Quads (nicht RGBa)
wenn (b[2] >= lr) und (b[2] <= hr) und
(b[1] >= lg) und (b[1] <= hg) und
(b[0] >= lb) und (b[0] <= hb) dann
Break; // Pixel ist transparent
Inc(x);
Ende;
{ Testen Sie, ob wir einen nicht transparenten Bereich im Bild haben. }
wenn x > x0 dann
beginnen
{ RgnData um AllocUnit Rects erhöhen, wenn wir maxRects überschreiten }
wenn RgnData^.rdh.nCount >= maxRects dann
beginnen
Inc(maxRects,AllocUnit);
ReallocMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
Ende;
{ Füge das Rechteck (x0, y)-(x, y+1) als neuen sichtbaren Bereich in der Region hinzu}
pr := @RgnData^.Buffer; // Buffer ist ein Array von Rects
mit RgnData^.rdh tun
beginnen
SetRect(pr[nCount], x0, y, x, y+1);
{ Passen Sie das begrenzte Rechteck der Region an, wenn wir uns „außerhalb der Grenzen“ befinden. }
if x0 < rcBound.Left then rcBound.Left := x0;
if y < rcBound.Top then rcBound.Top := y;
if x > rcBound.Right then rcBound.Right := x;
if y+1 > rcBound.Bottom then rcBound.Bottom := y+1;
Inc(nCount);
Ende;
end; // wenn x > x0
wenn RgnData^.rdh.nCount = 2000 dann
beginnen
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects), RgnData^);
wenn Ergebnis > 0 dann
begin // Aktuelle Region erweitern
CombineRgn(Ergebnis, Ergebnis, h, RGN_OR);
DeleteObject(h);
Ende
else // Erste Region, weisen Sie sie dem Ergebnis zu
Ergebnis := h;
RgnData^.rdh.nCount := 0;
SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
Ende;
Inc(x);
end; // jedes Beispielbyte des Bildes scannen
Inc(Integer(ScanLinePtr), ScanLineInc);
Ende;
{ muss ExCreateRegion noch einmal aufrufen, da wir hätten gehen können }
{ ein RgnData mit weniger als 2000 Rects, daher wurde es noch nicht erstellt/kombiniert }
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects), RgnData^);
wenn Ergebnis > 0 dann
beginnen
CombineRgn(Ergebnis, Ergebnis, h, RGN_OR);
DeleteObject(h);
Ende
anders
Ergebnis := h;
Endlich
FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
Ende;
-------------------------------------------------- --------------------------------