用DrawDibDraw顯示BMP檔案

來源:互聯網
上載者:User

作者:CoolSlob
功能:碼用於完成在Panel上顯示一個BMP檔案(現多資訊請參閱BMP檔案結構相關文章)

var
  dc:HDC;
  hdd:HDRAWDIB;
  Stream: TStream;
  hdr: BITMAPFILEHEADER;
  m_pbmih: TBITMAPINFOHEADER;
  BITMAP_TYPE: WORD;

  S: string;
  len: Integer;
  DataSize: Integer;
begin
  //BMP檔案頭兩個欄位必須是BM
  BITMAP_TYPE := (WORD(Ord('M') shl 8)) or Ord('B');
 
  Stream := TFileStream.Create(sFileName{需要顯示的檔案名稱}, fmOpenRead );
  try
    //讀檔案頭
    len := Stream.Read(hdr, SizeOf(hdr));
    if ((len<>sizeof(hdr)) or (hdr.bfType<>BITMAP_TYPE)) then Exit;//無效BMP檔案

    //讀位元影像資訊頭
    Stream.Read(m_pbmih, SizeOf(m_pbmih));

    //計算位元影像資料大小
    // = 檔案總大小 - 檔案頭大小 - 位元影像資訊頭大小 - 顏色表大小
    //注意,顏色表大小由biBitCount來確定:
    //當biBitCount=1,4,8時,分別有2,16,256個表項;
    //當biBitCount=24時,沒有顏色表項。

    DataSize := Stream.Size - SizeOf(m_pbmih) - SizeOf(hdr);
    if (m_pbmih.biClrUsed = 0)and(m_pbmih.biBitCount<=8) then
      DataSize := DataSize - SizeOf(RGBQUAD) * (1 shl m_pbmih.biBitCount);

    //讀位元影像資料
    SetString(S, nil, DataSize);
    Stream.Read(Pointer(S)^, DataSize);

    dc:=GetDC(Panel1.Handle);
    hdd:=DrawDibOpen();

   //繪製圖片
    DrawDibDraw(hdd,
      dc,
      0,
      0,
      Panel1.Width,
      Panel1.Height,
      @m_pbmih,
      Pointer(S),
      0,
      0,
      -1,
      -1,
      0);

    DrawDibClose(hdd);
  finally
    FreeAndNil(Stream);
  end;
end;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.