Delphi共通画像フォーマット変換技術(2)
著者:lyboy99
電子メール:[email protected]
URL: http://hnh.126.com
一般的に使用されるいくつかの画像フォーマット変換方法とその変換関数を提供します。
お役に立てば幸いです
1.TxTをGIFに変換する
2.WMF形式をBMP形式に変換します
3.BMP形式をWMF形式に変換します
4. Windows リージョンへの TBitmaps
-------------------------------------------------- ------------------------
TxTからGIFへ
-------------------------------------------------- ------
手順 TxtToGif (txt, FileName: String);
変数
一時: TBitmap;
GIF: TGIF画像;
始める
temp:=TBitmap.Create;
試す
温度高さ :=400;
温度幅 :=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;
試す
GIF.Assign(一時);
//GIFを保存
GIF.SaveToFile(ファイル名);
Imagen.Picture.Assign (GIF);
ついに
GIF。無料。
終わり;
ついに
一時的に破壊します。
終わり;
終わり;
-------------------------------------------------- -------------------
2.WMF形式をBMP形式に変換します
-------------------------------------------------- ------------------
プロシージャ WmfToBmp(FicheroWmf,FicheroBmp:string);
変数
メタファイル:Tメタファイル;
Bmp:TBitmap;
始める
メタファイル:=TMetaFile.create;
{時間ビットマップを作成する}
Bmp:=TBitmap.create;
{メタファイルをロードする}
MetaFile.LoadFromFile(FicheroWmf);
{ビットマップのキャンバスにメタファイルを描画}
Bmp を使用して
始める
高さ:=メタファイル.高さ;
幅:=メタファイル.幅;
Canvas.Draw(0,0,MetaFile);
{BMP を保存する}
ファイルに保存(FicheroBmp);
{無料のBMP}
無料;
終わり;
{無料のメタファイル}
メタファイル.無料;
終わり;
-------------------------------------------------- -------------------
3.BMP形式をWMF形式に変換します
-------------------------------------------------- -------------------
プロシージャ BmpToWmf (BmpFile,WmfFile:string);
変数
メタファイル: TMetaFile;
MFCanvas: TMetaFileCanvas;
BMP:TBitmap;
始める
{一時を作成する}
メタファイル := TMetaFile.Create;
BMP := TBitmap.create;
BMP.LoadFromFile(BmpFile);
{イグアレモス タマ?オス}
{サイズを揃える}
MetaFile.Height := BMP.Height;
MetaFile.Width := BMP.Width;
{メタファイルのキャンバスを作成する}
MFCanvas:=TMetafileCanvas.Create(MetaFile, 0);
MFCanvas を使用して行う
始める
{BMP をキャンバスに描画します}
描画(0, 0, BMP);
{キャンバスを解放する}
無料;
終わり;
{BMP を解放する}
BMP.無料。
MetaFile を使用して行う
始める
{メタファイルを保存する}
ファイルに保存(WmfFile);
{解放してください...}
無料;
終わり;
終わり;
-------------------------------------------------- -------------------
4. Windows リージョンへの TBitmaps
-------------------------------------------------- -------------------
function BitmapToRegion(bmp: TBitmap; TransparentColor: TColor=clBlack;
RedTol: バイト = 1; GreenTol: バイト = 1): HRGN;
定数
AllocUnit = 100;
タイプ
PRectArray = ^TRectArray;
TRectArray = TRect の配列[0..(MaxInt div SizeOf(TRect))-1];
変数
pr: PRectArray;
h:HRGN;
RgnData: PRgnData;
lr、lg、lb、hr、hg、hb: バイト。
x、y、x0: 整数。
b: Pバイト配列;
ScanLinePtr: ポインタ。
ScanLineInc: 整数。
maxRects: 基数;
始める
結果 := 0;
{「透明」ピクセルの最低値と最高値を手元に置いておきます }
lr := GetRValue(透明色);
lg := GetGValue(透明色);
lb := GetBValue(透明色);
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));
試す
RgnData^.rdh を使用して行う
始める
dwSize := SizeOf(RGNDATAHEADER);
iType := RDH_RECTANGLES;
nカウント := 0;
nRgnサイズ := 0;
SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
終わり;
ScanLinePtr := bmp.ScanLine[0];
ScanLineInc := 整数(bmp.ScanLine[1]) - 整数(ScanLinePtr);
for y := 0 から bmp.Height - 1 まで
始める
x := 0;
while x < bmp.Width を行う
始める
x0 := x;
while x < bmp.Width を行う
始める
b := @PByteArray(ScanLinePtr)[x*SizeOf(TRGBQuad)];
// BGR-RGB: Windows 32bpp BMP は BGRa クワッド (RGBa ではありません) で構成されています
if (b[2] >= lr) および (b[2] <= hr)、および
(b[1] >= lg) および (b[1] <= hg) および
(b[0] >= ポンド) および (b[0] <= ポンド) の場合
Break; // ピクセルは透明です
Inc(x);
終わり;
{ 画像内に不透明な領域があるかどうかをテストする }
x > x0 の場合
始める
{ maxRects を超えた場合、RgnData を AllocUnit 個の四角形で増加します }
RgnData^.rdh.nCount >= maxRects の場合
始める
Inc(maxRects,AllocUnit);
ReallocMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
終わり;
{ 四角形 (x0, y)-(x, y+1) を領域内の新しい表示領域として追加します }
pr := @RgnData^.Buffer; // バッファは四角形の配列です
RgnData^.rdh を使用して行う
始める
SetRect(pr[nCount], x0, y, x, y+1);
{「範囲外」の場合は、領域の境界四角形を調整します }
x0 < rcBound.Left の場合、 rcBound.Left := x0;
y < rcBound.Top の場合、 rcBound.Top := y;
x > rcBound.Right の場合、 rcBound.Right := x;
y+1 > rcBound.Bottom の場合、 rcBound.Bottom := y+1;
Inc(nCount);
終わり;
終了; // x > x0 の場合
RgnData^.rdh.nCount = 2000 の場合
始める
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects), RgnData^);
結果 > 0 の場合
begin // 現在の領域を展開します
CombineRgn(結果, 結果, h, RGN_OR);
オブジェクトの削除(h);
終わり
else // 最初の領域を Result に割り当てます。
結果 := h;
RgnData^.rdh.nCount := 0;
SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
終わり;
Inc(x);
end; // 画像のすべてのサンプルバイトをスキャンします。
Inc(Integer(ScanLinePtr), ScanLineInc);
終わり;
{ 終了した可能性があるため、もう一度 ExCreateRegion を呼び出す必要があります }
{ RgnData の四角形が 2000 未満であるため、まだ作成/結合されていません }
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects), RgnData^);
結果 > 0 の場合
始める
CombineRgn(結果, 結果, h, RGN_OR);
オブジェクトの削除(h);
終わり
それ以外
結果 := h;
ついに
FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
終わり;
-------------------------------------------------- --------------------------------