程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 由圖像的灰度化看基本圖像處理(2)

由圖像的灰度化看基本圖像處理(2)

編輯:Delphi

  [顏色篇]

  在上一篇中提到了,那灰度化代碼只能適用於24位色(PixelFormats=pf24bit),為什麼?看看記錄類型tagRGBTRIPLE,正好24位,所以這樣只能處理24位色圖!

  那怎麼處理其他的位圖呢?

  先對這各種類型的位圖做些簡單的介紹~~~

  pf1bit:

  每個像素只需要用一位表示,如調色板定義的是黑白兩種顏色(0為黑,1為白),這時只能用位操作訪問像素信息!如定義

  var P:PByte

    for Y := 0 to (Bitmap.Height - 1) do
    begin
      p := Bitmap.ScanLine[Y];
      for X := 0 to (Bitmap.width - 1) DIV 8 + 1 do
      begin
        p^:=1 or 2 or 4 or 8 or 16 or 32 or 64 or 128;
        Inc(PRGB,3);
      end;
    end;

   p^:=1 or 2 or 4 or 8 or 16 or 32 or 64 or 128;
   這行代碼什麼意思呢?1=1(二進制),2=10(二進制),4=100(二進制),8=1000(二進制)...

   結合上篇中解釋了的或運算,很容易理解就以八個字位為單位,給其賦上顏色信息!

  pf4bit:

  和pf1bit位圖一樣,操作pf4bit位圖也需要用位操作。

  pf8bit:

  可直接利用Byte、TByteArray,但用Scanline取的值表示的只是調色板上顏色的索引。

  pf15bit和pf16bit:

  這兩種位圖都是16位的,pf15bit是第一位為0,後15位的每5位分別表示紅、綠、藍。而pf16bit中綠色占6位,其它兩種顏色占用5位(人眼對綠色比較敏感)!

   pf24bit位圖轉pf15bit位圖代碼

   var
  Row24:pRGBTriple;
  Row15:PWord;

   for j := 0 TO Bitmap.Height-1 DO
   begin
     Row15 := Bitmap15.Scanline[j];
     Row24 := Bitmap24.Scanline[j];
     for i := 0 TO Bitmap.Width-1 DO
     begin
       with Row24^ do
         Row15^ := (rgbtRed Shr 3) Shl 10 or (rgbtGreen Shr 3) Shl 5 or (rgbtBlue Shr 3);
       Inc(Row24);
       Inc(Row15);
     end
   end;

  pf24bit和pf32bit:
   
   pf24bit上面的已多次用到,就不多說了。而pf32bit和pf24bit一樣,用24位來記錄三原色的顏色信息!
   PRGBQuad = ^TRGBQuad;
   tagRGBQUAD = packed record
  rgbBlue: Byte;
  rgbGreen: Byte;
  rgbRed: Byte;
  rgbReserved: Byte;
   end;
   TRGBQuad = tagRGBQUAD;

   如果要修改上面的程序,就是簡單的PRGBQuad替換PRGBTriple,TRGBQuad替換TRGBTriple的過程~

   測試表明在pf32bit中利用Scanline處理圖像要比pf24bit快。

   所以除了單色圖(PixelFormats=pf1bit)外(沒必要),其它都可轉外32位色實現灰度化。這也是一種比較可行的方法!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved