เทคโนโลยีการแปลงรูปแบบภาพทั่วไปของ Delphi (2)
ผู้แต่ง:lyboy99
อีเมล์:[email protected]
URL: http://hnh.126.com
จัดเตรียมวิธีการแปลงรูปแบบภาพที่ใช้กันทั่วไปหลายวิธีและฟังก์ชันการแปลง
หวังว่ามันจะช่วยคุณได้
1. แปลง TxT เป็น GIF
2. แปลงรูปแบบ WMF เป็นรูปแบบ BMP
3. แปลงรูปแบบ BMP เป็นรูปแบบ WMF
4.TBitmaps ไปยังภูมิภาค Windows
-------------------------------------------------- -------------------------------------------------- -------------------------------
TxT เป็น GIF
-
กระบวนการ 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 (ไม่มี);
GIF := TGIFImage.สร้าง;
พยายาม
GIF.กำหนด(ชั่วคราว);
//บันทึก GIF
GIF.SaveToFile(ชื่อไฟล์);
Imagen.Picture.Assign (GIF);
ในที่สุด
GIF ฟรี;
จบ;
ในที่สุด
อุณหภูมิทำลาย;
จบ;
จบ;
-------------------------------------------------- -------------------------------------------------- -------------------
2. แปลงรูปแบบ WMF เป็นรูปแบบ BMP
-------------------------------------------------- -------------------------------------------------- ------------------
ขั้นตอน WmfToBmp(FicheroWmf,FicheroBmp:string);
var
MetaFile:TMetafile;
Bmp:TBitmap;
เริ่ม
เมตาไฟล์:=TMetaFile.create;
{สร้างบิตแมปชั่วคราว}
Bmp:=TBitmap.create;
{โหลดเมตาไฟล์}
MetaFile.LoadFromFile(FicheroWmf);
{วาด metafile บนผืนผ้าใบของบิตแมป}
กับ Bmp ทำ
เริ่ม
ความสูง:=Metafile.Height;
ความกว้าง:=Metafile.Width;
Canvas.Draw(0,0,เมตาไฟล์);
{บันทึก BMP}
SaveToFile(FicheroBmp);
{BMP ฟรี}
ฟรี;
จบ;
{เมตาไฟล์ฟรี}
MetaFile.ฟรี;
จบ;
-------------------------------------------------- -------------------------------------------------- -------------------
3. แปลงรูปแบบ BMP เป็นรูปแบบ WMF
-------------------------------------------------- -------------------------------------------------- -------------------
ขั้นตอน BmpToWmf (BmpFile, WmfFile:string);
var
MetaFile: TMetaFile;
MFCanvas: TMetaFileCanvas;
BMP: TBitmap;
เริ่ม
{สร้างชั่วคราว}
MetaFile := TMetaFile.Create;
BMP := TBitmap.create;
BMP.LoadFromFile(BmpFile);
{อีกวาเลมอส ทามา?ออส}
{ขนาดเท่ากัน}
MetaFile.Height := BMP.Height;
MetaFile.Width := BMP.Width;
{สร้างผืนผ้าใบสำหรับ Metafile}
MFCanvas:=TMetafileCanvas.Create(MetaFile, 0);
ด้วย MFCanvas ทำ
เริ่ม
{วาด BMP ลงในแคนวาส}
วาด(0, 0, BMP);
{ปลดปล่อยผืนผ้าใบ}
ฟรี;
จบ;
{ฟรี BMP}
BMP.ฟรี;
ด้วย MetaFile ทำ
เริ่ม
{บันทึกเมตาไฟล์}
SaveToFile(WmfFile);
{ฟรีเลย...}
ฟรี;
จบ;
จบ;
-------------------------------------------------- -------------------------------------------------- -------------------
4.TBitmaps ไปยังภูมิภาค Windows
-------------------------------------------------- -------------------------------------------------- -------------------
ฟังก์ชั่น BitmapToRegion (bmp: TBitmap; TransparentColor: TColor = clBlack;
RedTol: ไบต์=1; GreenTol: ไบต์=1; BlueTol: ไบต์=1): HRGN;
ค่าคงที่
หน่วยจัดสรร = 100;
พิมพ์
PREctArray = ^TRectArray;
TRectArray = Array[0..(MaxInt div SizeOf(TRect))-1] ของ TRect;
var
ราคา: PRectArray;
ชั่วโมง:HRGN;
RgnData: PRgnData;
lr, lg, lb, ชม, hg, hb: ไบต์;
x,y,x0: จำนวนเต็ม;
ข: PByteArray;
ScanLinePtr: ตัวชี้;
ScanLineInc: จำนวนเต็ม;
maxRects: พระคาร์ดินัล;
เริ่ม
ผลลัพธ์ := 0;
{ เก็บค่าต่ำสุดและสูงสุดไว้สำหรับพิกเซล "โปร่งใส" }
lr := GetRValue(สีโปร่งใส);
lg := GetGValue (สีโปร่งใส);
ปอนด์ := GetBValue(สีโปร่งใส);
ชม := นาที($ff, lr + RedTol);
hg := นาที($ff, lg + GreenTol);
hb := นาที($ff, ปอนด์ + BlueTol);
bmp.PixelFormat := pf32bit;
maxRects := AllocUnit;
GetMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * maxRects));
พยายาม
ด้วย RgnData^.rdh ทำ
เริ่ม
dwSize := ขนาดของ(RGNDATAHEADER);
iType := RDH_RECTANGLES;
จำนวนนับ := 0;
nRgnSize := 0;
SetRect(rcBound, MAXLONG, MAXLONG, 0, 0);
จบ;
ScanLinePtr := bmp.ScanLine[0];
ScanLineInc := จำนวนเต็ม (bmp.ScanLine [1]) - จำนวนเต็ม (ScanLinePtr);
สำหรับ 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 quads (ไม่ใช่ RGBa)
ถ้า (b[2] >= lr) และ (b[2] <= ชม.) และ
(b[1] >= lg) และ (b[1] <= hg) และ
(b[0] >= ปอนด์) และ (b[0] <= hb) จากนั้น
แตก; // พิกเซลมีความโปร่งใส
อิงค์(x);
จบ;
{ ทดสอบเพื่อดูว่าเรามีพื้นที่ที่ไม่โปร่งใสในภาพหรือไม่ }
ถ้า x > x0 แล้ว
เริ่ม
{ เพิ่ม RgnData โดย AllocUnit แก้ไขถ้าเราเกิน maxRects }
ถ้า RgnData^.rdh.nCount >= maxRects แล้ว
เริ่ม
Inc(maxRects,จัดสรรหน่วย);
ReallocMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
จบ;
{ เพิ่มรูปสี่เหลี่ยมผืนผ้า (x0, y)-(x, y+1) เป็นพื้นที่ใหม่ที่มองเห็นได้ในภูมิภาค }
pr := @RgnData^.Buffer; // 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นับ);
จบ;
สิ้นสุด; // ถ้า x > x0
ถ้า RgnData^.rdh.nCount = 2000 แล้ว
เริ่ม
h := ExtCreateRegion (ไม่มี, SizeOf (RGNDATAHEADER) + (SizeOf (TRect) * maxRects), RgnData ^);
ถ้าผลลัพธ์> 0 แล้ว
start // ขยายขอบเขตปัจจุบัน
CombineRgn(ผลลัพธ์, ผลลัพธ์, h, RGN_OR);
ลบวัตถุ(h);
จบ
else // ขอบเขตแรก กำหนดให้กับผลลัพธ์
ผลลัพธ์ := ชั่วโมง;
RgnData^.rdh.nCount := 0;
SetRect(RgnData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
จบ;
อิงค์(x);
end; // สแกนทุกไบต์ตัวอย่างของรูปภาพ
Inc(จำนวนเต็ม(ScanLinePtr), ScanLineInc);
จบ;
{ ต้องโทรหา ExCreateRegion อีกครั้งเพราะเราอาจออกไปแล้ว }
{ RgnData ที่มีน้อยกว่า 2,000 การแก้ไข ดังนั้นจึงยังไม่ได้สร้าง/รวม }
h := ExtCreateRegion (ไม่มี, SizeOf (RGNDATAHEADER) + (SizeOf (TRect) * MaxRects), RgnData ^);
ถ้าผลลัพธ์> 0 แล้ว
เริ่ม
CombineRgn(ผลลัพธ์, ผลลัพธ์, h, RGN_OR);
ลบวัตถุ(h);
จบ
อื่น
ผลลัพธ์ := ชั่วโมง;
ในที่สุด
FreeMem(RgnData,SizeOf(RGNDATAHEADER) + (SizeOf(TRect) * MaxRects));
จบ;
-------------------------------------------------- -------------------------------------------------- --------------------------------