全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1775
推到 Plurk!
推到 Facebook!

如何判斷PixelFormat為pfDevice時是什麼樣的圖?

答題得分者是:geniustom
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-02 22:19:37 IP:163.13.xxx.xxx 未訂閱
當影像讀進來時, pixelformat = pfDevice時 要用什麼方法才能知道他是灰階還是彩色? 又如何判斷是多少bits的color 謝謝
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-04 06:37:11 IP:219.68.xxx.xxx 未訂閱
pchw8598 您好..以下是SetPixelFormat的原型..  
procedure TBitmap.SetPixelFormat(Value: TPixelFormat);
const
  BitCounts: array [pf1Bit..pf32Bit] of Byte = (1,4,8,16,16,24,32);
var
  DIB: TDIBSection;
  Pal: HPalette;
  DC: HDC;
  KillPal: Boolean;
begin
  if Value = GetPixelFormat then Exit;
  case Value of
    pfDevice:
      begin
        HandleType := bmDDB;
        Exit;
      end;
    pfCustom: InvalidGraphic(@SInvalidPixelFormat);
  else
    FillChar(DIB, sizeof(DIB), 0);
    DIB.dsbm := FImage.FDIB.dsbm;
    KillPal := False;
    with DIB, dsbm, dsbmih do
    begin
      bmBits := nil;
      biSize := sizeof(DIB.dsbmih);
      biWidth := bmWidth;
      biHeight := bmHeight;
      biPlanes := 1;
      biBitCount := BitCounts[Value];
      Pal := FImage.FPalette;
      case Value of
        pf4Bit: Pal := SystemPalette16;
        pf8Bit:
          begin
            DC := GDICheck(GetDC(0));
            Pal := CreateHalftonePalette(DC);
            KillPal := True;
            ReleaseDC(0, DC);
          end;
        pf16Bit:
          begin
            biCompression := BI_BITFIELDS;
            dsBitFields[0] := $F800;
            dsBitFields[1] := $07E0;
            dsBitFields[2] := $001F;
          end;
      end;
      try
        CopyImage(Handle, Pal, DIB);
        PaletteModified := Pal <> 0;
      finally
        if KillPal then DeleteObject(Pal);
      end;
      Changed(Self);
    end;
  end;
end;
意思就是說..目前顯示卡設定是幾BITS..就直接輸出幾BITS.. 因為他是直接從記憶體DC中把值取出來.. 假設您的顯示卡設定為32BIT..但是您要顯示的是24BIT.. 他必須要先從記憶體讀出來..轉換後..才輸出..所以如果您設定的BIT數與桌面解析度的BIT數不合..處理的速度會比較慢.. 以上是廢話... 您要知道 > 如何知道目前電腦的解析度,顏色位色數和掃描頻率 >
geniustom
版主


發表:100
回覆:303
積分:260
註冊:2003-01-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-04 06:57:27 IP:219.68.xxx.xxx 未訂閱
不好意思阿..PO文之後才發現是BCB版 我幫您找了 class="code"> int tcs; long int bpp,cp,tc; Memo1→Lines→Add (“當前解析度?:”+String(Screen→Width)+“*”+S tring(Screen→Height)); bpp=GetDeviceCaps(Form1→Canvas→Handle ,BITSPIXEL); bpp=GetDeviceCaps(Form1→Canvas→Handle ,BITSPIXEL); tcs=pow(2,bpp); //計算色彩的梯度數 cp= GetDeviceCaps(Form1→Canvas→Handle,PLANES); tc= pow(tcs,cp); //計算色深 Memo1→Lines→Add(“當前色深?:”+String(tc));
pchw8598
一般會員


發表:43
回覆:63
積分:21
註冊:2003-11-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-04 08:43:15 IP:163.21.xxx.xxx 未訂閱
了解, 我也剛查到此方法, 但還在想GetDeviceCaps的第一項參數要填什麼 謝謝
系統時間:2024-05-04 20:27:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!