델파이 공통 이미지 포맷 변환 기술(2)
저자:lyboy99
URL: http://hnh.126.com
일반적으로 사용되는 여러 가지 이미지 형식 변환 방법과 해당 변환 기능을 제공합니다.
그것이 당신에게 도움이 되기를 바랍니다
1. TxT를 GIF로 변환
2. WMF 형식을 BMP 형식으로 변환
3. BMP 형식을 WMF 형식으로 변환
4.Windows 영역에 대한 비트맵
------------------------------------- -------------
TxT를 GIF로
------------------------------------- ------
PRocedure TxtToGif(txt, 파일 이름: 문자열);
var
임시: TBitmap;
GIF: TGIF이미지;
시작하다
임시:=TBitmap.Create;
노력하다
온도.높이 :=400;
온도.폭 :=60;
임시.투명:=참;
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);
var
메타파일:TMetafile;
Bmp:TBitmap;
시작하다
메타파일:=TMetaFile.create;
{시간적 비트맵 생성}
Bmp:=TBitmap.create;
{메타파일 로드}
MetaFile.LoadFromFile(FicheroWmf);
{Bitmap의 캔버스에 메타파일을 그립니다.}
Bmp와 함께
시작하다
높이:=메타파일.높이;
너비:=메타파일.너비;
Canvas.Draw(0,0,MetaFile);
{BMP 저장}
SaveToFile(FicheroBmp);
{무료 BMP}
무료;
끝;
{무료 메타파일}
메타파일.무료;
끝;
------------------------------------- ------
3. BMP 형식을 WMF 형식으로 변환
------------------------------------- ------
절차 BmpToWmf(BmpFile,WmfFile:string);
var
메타파일: TMetaFile;
MFCanvas: TMetaFileCanvas;
BMP: TB비트맵;
시작하다
{임시 생성}
메타파일 := TMetaFile.Create;
BMP := TBitmap.create;
BMP.LoadFromFile(Bmp파일);
{Igualemos tama?os}
{균등화 크기}
메타파일.높이 := BMP.높이;
메타파일.폭 := BMP.폭;
{메타파일용 캔버스 생성}
MFCanvas:=TMetafileCanvas.Create(MetaFile, 0);
MFCanvas를 사용하면
시작하다
{BMP를 캔버스에 그리기}
그리기(0, 0, BMP);
{캔버스를 풀어주세요}
무료;
끝;
{BMP를 해제하세요}
BMP.무료;
MetaFile을 사용하면
시작하다
{메타파일 저장}
SaveToFile(Wmf파일);
{무료로 해주세요...}
무료;
끝;
끝;
------------------------------------- ------
4.Windows 영역에 대한 비트맵
------------------------------------- ------
함수 BitmapToRegion(bmp: TBitmap; TransparentColor: TColor=clBlack;
RedTol: 바이트=1; GreenTol: 바이트=1; BlueTol: 바이트=1): HRGN;
const
할당단위 = 100;
유형
PRectArray = ^TRectArray;
TRectArray = TRect의 배열[0..(MaxInt div SizeOf(TRect))-1];
var
pr: PRectArray;
h:HRGN;
RgnData: PRgn데이터;
lr, lg, lb, hr, hg, hb: 바이트;
x,y,x0: 정수;
b: PByteArray;
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;
nRgnSize := 0;
SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
끝;
ScanLinePtr := bmp.ScanLine[0];
ScanLineInc := Integer(bmp.ScanLine[1]) - Integer(ScanLinePtr);
for y := 0에서 bmp.Height - 1 do
시작하다
x := 0;
x < bmp.Width 하는 동안
시작하다
x0 := x;
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] >= lb) 및 (b[0] <= hb) 그런 다음
Break; // 픽셀이 투명합니다.
Inc(x);
끝;
{ 이미지에 불투명한 영역이 있는지 테스트해 보세요. }
x > x0이면
시작하다
{ maxRects를 초과하는 경우 AllocUnit rets만큼 RgnData 증가 }
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(n개수);
끝;
end; // x > x0인 경우
RgnData^.rdh.nCount = 2000이면
시작하다
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects), RgnData^);
결과 > 0이면
시작 // 현재 지역 확장
CombineRgn(결과, 결과, h, RGN_OR);
삭제오브젝트(h);
끝
else // 첫 번째 영역, Result에 할당
결과 := h;
RgnData^.rdh.nCount := 0;
SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
끝;
Inc(x);
end; // 이미지의 모든 샘플 바이트를 스캔합니다.
Inc(정수(ScanLinePtr), ScanLineInc);
끝;
{ 우리가 떠날 수도 있었기 때문에 ExCreateRegion을 한 번 더 호출해야 합니다 }
{ 2000개 미만의 직사각형이 있는 RgnData이므로 아직 생성/결합되지 않았습니다. }
h := ExtCreateRegion(nil, SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects), RgnData^);
결과 > 0이면
시작하다
CombineRgn(결과, 결과, h, RGN_OR);
삭제오브젝트(h);
끝
또 다른
결과 := h;
마지막으로
FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
끝;
------------------------------------- --------------------------------