偵測圖檔的格式,但XP沒有作用 |
答題得分者是:wameng
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
以下的程式碼,在98及2000皆可使用,但在XP無法使用,只要能偵測BMP及JPG即可,謝謝!
function TForm1.PhysicalResolveFileType(Filename: string): Integer; var p: PChar; AStream : TFileStream; begin AStream := TFileStream.Create(Filename, fmOpenRead OR fmShareDenyNone); try Result := 0; if not Assigned(AStream) then Exit; GetMem(p, 10); try AStream.Position := 0; AStream.Read(p[0], 10); {bitmap format 1} if (p[0] = #66) and (p[1] = #77) then Result := 1; {tiff format 2} if ((p[0] = #73) and (p[1] = #73) and (p[2] = #42) and (p[3] = #0)) or (( p[0] = #77) and (p[1] = #77) and (p[2] = #42) and ( p[3] = #0)) then Result := 2; {jpg format 3} if (p[6] = #74) and (p[7] = #70) and (p[8] = #73) and (p[9] = #70) then Result := 3; {png format 4} if (p[0] = #137) and (p[1] = #80) and (p[2] = #78) and (p[3] = #71) and (p[4] = #13) and (p[5] = #10) and (p[6] = #26) and (p[7] = #10) then Result := 4; {dcx format 5} if (p[0] = #177) and (p[1] = #104) and (p[2] = #222) and (p[3] = #58) then Result := 5; {pcx format 6} if p[0] = #10 then Result := 6; {emf format 7} if (p[0] = #215) and (p[1] = #205) and (p[2] = #198) and (p[3] = #154) then Result := 7; {emf format} if (p[0] = #1) and (p[1] = #0) and (p[2] = #0) and (p[3] = #0) then Result := 7; finally Freemem( p ); end; FINALLY AStream.Free END; end;努力會更接近成功
------
努力會更接近成功 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
謝謝您的回應,,主因是我出外工作的編譯環境只有2000和98下程式可以使用,但前日至台北時在XP HOME SP2環境下卻出現偶而有作用,(162個檔約2-3O個檔有作用,很怪)和JPEG2000有關嗎??
以下是我今天到台中公司用xp(可能是PERFINAL版,沒注意是否為SP2)測的程式,可以使用
// Avoid JPEG Error #52: // Verify first two bytes of JPEG are $FFD8 (little endian $D8FF) // Verify last two bytes of JPEG are $FFD9 (little endian $D9FF) FUNCTION JPEGSentinelsAreOK(CONST Filename: TFilename): BOOLEAN; VAR FileStream: TFileStream; w1 : WORD; // a "word" is always 2 bytes long w2 : WORD; BEGIN ASSERT(SizeOf(WORD) = 2); RESULT := FileExists(Filename); IF RESULT THEN BEGIN FileStream := TFileStream.Create(Filename, fmOpenRead OR fmShareDenyNone); TRY FileStream.Seek(0, soFromBeginning); // use seek or position FileStream.Read(w1,2); FileStream.Position := FileStream.Size - 2; FileStream.Read(w2,2) FINALLY FileStream.Free END; RESULT := (w1 = $D8FF) AND (w2 = $D9FF); END END;JPEG格式算可以用了 不知有沒有BMP格式的函數可以用,謝謝 努力會更接近成功
------
努力會更接近成功 |
wameng
版主 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
pceyes
尊榮會員 發表:70 回覆:657 積分:1140 註冊:2003-03-13 發送簡訊給我 |
謝謝您的回答
BMP的檔頭在此
function GetBitmapDimension(const AFilename: String; var AWidth, AHeight: Integer): Boolean; var f : TFileStream; bfh : TBitmapFileHeader; HeaderSize : DWord; w : Word; begin Result := False; AWidth := 0; AHeight := 0; f := TFileStream.Create(AFilename, fmOpenRead or fmShareDenyNone); try f.ReadBuffer(bfh, SizeOf(bfh)); if bfh.bfType <> $4d42 then Exit; // 'BM' f.ReadBuffer(HeaderSize, SizeOf(HeaderSize)); case HeaderSize of SizeOf(TBitmapCoreHeader) : begin // OS/2 Bitmap f.ReadBuffer(w, SizeOf(w)); AWidth := w; f.ReadBuffer(w, SizeOf(w)); AHeight := w; end; SizeOf(TBitmapInfoHeader), SizeOf(TBitmapV4Header), SizeOf(TBitmapV5Header) : begin f.ReadBuffer(AWidth, SizeOf(AWidth)); f.ReadBuffer(AHeight, SizeOf(AHeight)); end; else Exit; // unknown Bitmap format end; // there are top down bitmaps with a negative height AHeight := Abs(AHeight); Result := True; finally f.Free; end; end;努力會更接近成功
------
努力會更接近成功 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |