線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1450
推到 Plurk!
推到 Facebook!

偵測圖檔的格式,但XP沒有作用

答題得分者是:wameng
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-04-03 22:31:51 IP:59.114.xxx.xxx 未訂閱
以下的程式碼,在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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-04-03 22:43:48 IP:219.81.xxx.xxx 未訂閱
只是判斷檔案內容中的檔頭格式,應該跟作業系統無關吧!
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-04-04 09:08:41 IP:220.131.xxx.xxx 未訂閱
謝謝您的回應,,主因是我出外工作的編譯環境只有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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-04-04 11:38:21 IP:61.222.xxx.xxx 未訂閱
可能是檔案格式沒有比對完全。 1.BMP 檔案開頭 絕對應是 42 4D 開始。 2.JPG 為 FF D8 可以參考這裡 http://www.fastgraph.com/help/image_file_header_formats.html
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-04-04 12:11:18 IP:220.131.xxx.xxx 未訂閱
謝謝您的回答 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;    
努力會更接近成功
------
努力會更接近成功
系統時間:2024-05-04 0:29:59
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!