Image can show preview-image in dwg file (autocad file name) (Views: 31)
Problem/Question/Abstract: I have writen a component from image which can show the preview-image in dwg file Answer: unit DWGView; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls; type BITMAPINFO256 = record bmiHeader: BITMAPINFOHEADER; bmiColors: array[0..255] of RGBQUAD; end; type TNoPreviewEvent = procedure(Sender: TOBject) of object; TFileErrorEvent = procedure(Sender: TOBject; DWGName: string) of object; TDWGView = class(TImage) private FDWGVersion: string; FDWGFile: string; FNoPreviewEvent: TNoPreviewEvent; FOnFileError: TFileErrorEvent; FImage: TImage; procedure SetDWGFile(const Value: string); procedure SetFImage(const Value: TImage); { Private declarations } protected procedure ReadDWG; constructor TDWGView; { Protected declarations } public { Public declarations } published { Published declarations } property Image: TImage read FImage write SetFImage; property DWGFile: string read FDWGFile write SetDWGFile; property DWGVersion: string read FDWGVersion; property OnNoPreview: TNoPreviewEvent read FNoPreviewEvent write FNoPreviewEvent; property OnFileError: TFileErrorEvent read FOnFileError write FOnFileError; end; procedure Register; implementation procedure Register; begin RegisterComponents('Voice', [TDWGView]); end; procedure TDWGView.ReadDWG; var DWGF: TFileStream; // ?¡???Ä¡? MemF: TMemoryStream; // ??µ????ö?é BMPF: TMemoryStream; // ?»?¡?Ä¡? SentinelF: TMemoryStream; //?¨Õ÷×Ö¶? 16×Ö½? bif: BITMAPINFO256; // ?»?¡?Ä¡??Å?¢ bfh: BITMAPFILEHEADER; // ?»?¡?Ä¡??Ä¡??· 14×Ö½? PosSentinel: LongInt; // ?¨Õ÷×Ö¶??»Ö? LenPreview: Integer; // ³??¨Õ÷×Ö¶?Ö®??Õ?¬ö?¤???¡¯¬??µ?µÄ³¤¶? RasterPreview: ShortInt; // ?µ?÷?¤???¡¯¬????µÄ?»¬öµ?×Ö½?Õ??? // 0 ²»±£???¤???¡¯¬ 1 ±£??BMP?¡¯¬ // 2 ±£??WMF?¡¯¬ 3 ?¬?±±£??BMP??WMF?¡¯¬ PosBMP: Integer; // ?¡¯¬µÄÕ¿?µ?»Ö?£¬²»?»¶«???»?¡ LenBMP: Integer; // ?¡¯¬³¤¶?£¬²»?¬BITMAPFILEHEADER??µ?£¬²»?»¶«???»?¡ IndexPreview: Integer; TypePreview: Shortint; // ?¡¯¬???? begin if Assigned(FOnFileError) then FOnFileError(Self, FDWGFile); DWGF := TFileStream.Create(FDWGFile, fmOpenRead); BMPF := TMemoryStream.Create; MemF := TMemoryStream.Create; SentinelF := TMemoryStream.Create; try SetLength(FDWGVersion, 6); DWGF.ReadBuffer(FDWGVersion[1], 6); DWGF.Position := 13; // ?Ä¡?¯??¡13´¦Ö¬???¨Õ÷×Ö¶? DWGF.Read(PosSentinel, 4); DWGF.Position := PosSentinel; SentinelF.CopyFrom(DWGF, 16); // ¶????¨Õ÷×Ö¶? DWGF.Read(LenPreview, 4); // ¶??? DWGF.Read(RasterPreview, 1); // ¶????¡¯¬???? for IndexPreview := RasterPreview - 1 downto 0 do begin MemF.Position := 0; MemF.CopyFrom(DWGF, 9); // ?¡¯¬???ö?é 9×Ö½? MemF.Position := 0; MemF.Read(TypePreview, 1); // TypePreview ?¡¯¬???? case TypePreview of 1: ; // ?¡??µÄ???öÄ??? 2: begin // BMP?¡¯¬,??DWG?Ä¡?Ö?±£´¿µÄBMP?¡¯¬?É????????×?BMP±¿·¶µÄ // ?¡?ó?Ä¡???µ?£¬µ«??²»±£´¿BITMAPFILEHEADER??µ? MemF.Position := 1; MemF.Read(PosBMP, 4); // 2,5 MemF.Read(LenBMP, 4); // 6,9 DWGF.Position := PosBMP; DWGF.ReadBuffer(bif, sizeof(bif)); with bif do begin bmiColors[0].rgbBlue := 0; bmiColors[0].rgbGreen := 0; bmiColors[0].rgbRed := 0; bmiColors[225].rgbBlue := 255; bmiColors[225].rgbGreen := 255; bmiColors[225].rgbRed := 255; end; bfh.bfType := $4D42; bfh.bfSize := LenBMP + sizeof(bfh); // bfh.bfReserved1 := 0; bfh.bfReserved2 := 0; bfh.bfOffBits := 14 + $28 + 1024; BMPF.Position := 0; BMPF.Write(bfh, sizeof(bfh)); BMPF.WriteBuffer(bif, sizeof(bif)); BMPF.CopyFrom(DWGF, LenBMP - 1064); BMPF.Position := 0; Picture.Bitmap.LoadFromStream(BMPF); end; 3: ; // WMF?Ä¡?£¬?ü´¸Ó?22×Ö½?³¤µÄAldus?Ä¡??· end; end; finally SentinelF.Free; MemF.Free; DWGF.Free; BMPF.Free; end; end; procedure TDWGView.SetDWGFile(const Value: string); begin FDWGFile := Value; ReadDWG; end; procedure TDWGView.SetFImage(const Value: TImage); begin FImage := Value; end; constructor TDWGView.TDWGView; begin //TODO: Add your source code here FDWGFile := ''; FDWGVersion := ''; end; end. |