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

基本圖象處理代碼

編輯:Delphi
[亮度、對比度、飽和度的調整]

  //亮度調整
  procedure BrightnessChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);
  var
    i, j: integer;
    SrcRGB, DestRGB: pRGBTriple;
    Table: array[0..255]of Byte;
  begin
    if ValueChange > 0 then
      for i := 0 to 255 do
        Table[i]:=Byte(i + ((ValueChange * (i xor 255)) shr 8))
    else
      for i := 0 to 255 do
        Table[i]:=Byte(i - ((Abs(ValueChange) * i) shr 8));
    for i := 0 to SrcBmp.Height - 1 do
    begin
      SrcRGB := SrcBmp.ScanLine[i];
      DestRGB := DestBmp.ScanLine[i];
      for j := 0 to SrcBmp.Width - 1 do
      begin
        DestRGB^.rgbtRed := Table[SrcRGB^.rgbtRed];
        DestRGB^.rgbtGreen := Table[SrcRGB^.rgbtGreen];
        DestRGB^.rgbtBlue := Table[SrcRGB^.rgbtBlue];
        Inc(SrcRGB);
        Inc(DestRGB);
      end;
    end;
  end;

  //對比度調整
  procedure ContrastChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);
  var
    i, j: integer;
    SrcRow, DestRow: pRGBTriple;
  begin
    for i := 0 to SrcBmp.Height - 1 do
    begin
      SrcRow := SrcBmp.ScanLine[i];
      DestRow := DestBmp.ScanLine[i];
      for j := 0 to SrcBmp.Width - 1 do
      begin
        if ValueChange>=0 then
        begin
        if SrcRow.rgbtRed >= 128 then
          DestRow.rgbtRed := Min(255, SrcRow.rgbtRed + (Abs(128 - SrcRow.rgbtRed) * ValueChange) div 128)
        else
          DestRow.rgbtRed := Max(0, SrcRow.rgbtRed - (Abs(128 - SrcRow.rgbtRed) * ValueChange) div 128);
        if SrcRow.rgbtGreen >= 128 then
          DestRow.rgbtGreen := Min(255, SrcRow.rgbtGreen + (Abs(128 - SrcRow.rgbtGreen) * ValueChange) div 128)
        else
          DestRow.rgbtGreen := Max(0, SrcRow.rgbtGreen - (Abs(128 - SrcRow.rgbtGreen) * ValueChange) div 128);
        if SrcRow.rgbtBlue >= 128 then
          DestRow.rgbtBlue := Min(255, SrcRow.rgbtBlue + (Abs(128 - SrcRow.rgbtBlue) * ValueChange) div 128)
        else
          DestRow.rgbtBlue := Max(0, SrcRow.rgbtBlue - (Abs(128 - SrcRow.rgbtBlue) * ValueChange) div 128);
        end
        else
        begin
        if SrcRow.rgbtRed >= 128 then
          DestRow.rgbtRed := Max(128, SrcRow.rgbtRed + (Abs(128 - SrcRow.rgbtRed) * ValueChange) div 128)
        else
          DestRow.rgbtRed := Min(128, SrcRow.rgbtRed - (Abs(128 - SrcRow.rgbtRed) * ValueChange) div 128);
        if SrcRow.rgbtGreen >= 128 then
          DestRow.rgbtGreen := Max(128, SrcRow.rgbtGreen + (Abs(128 - SrcRow.rgbtGreen) * ValueChange) div 128)
        else
          DestRow.rgbtGreen := Min(128, SrcRow.rgbtGreen - (Abs(128 - SrcRow.rgbtGreen) * ValueChange) div 128);
        if SrcRow.rgbtBlue >= 128 then
          DestRow.rgbtBlue := Max(128, SrcRow.rgbtBlue + (Abs(128 - SrcRow.rgbtBlue) * ValueChange) div 128)
        else
          DestRow.rgbtBlue := Min(128, SrcRow.rgbtBlue - (Abs(128 - SrcRow.rgbtBlue) * ValueChange) div 128);
        end;
        Inc(SrcRow);
        Inc(DestRow);
      end;
    end;
  end;

  //飽和度調整
  procedure SaturationChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);
  var
    Grays: array[0..767] of Integer;
    Alpha: array[0..255] of Word;
    Gray, x, y: Integer;
    SrcRGB,DestRGB: pRGBTriple;
    i: Byte;
  begin
  ValueChange:=ValueChange+255;
  for i := 0 to 255 do
    Alpha[i] := (i * ValueChange) Shr 8;
  x := 0;
  for i := 0 to 255 do
  begin
    Gray := i - Alpha[i];
    Grays[x] := Gray;
    Inc(x);
    Grays[x] := Gray;
    Inc(x);
    Grays[x] := Gray;
    Inc(x);
  end;
  for y := 0 to SrcBmp.Height - 1 do
  begin
    SrcRGB := SrcBmp.ScanLine[Y];
    DestRGB := DestBmp.ScanLine[Y];
    for x := 0 to SrcBmp.Width - 1 do
    begin
      Gray := Grays[SrcRGB.rgbtRed + SrcRGB.rgbtGreen + SrcRGB.rgbtBlue];
      if Gray + Alpha[SrcRGB.rgbtRed]>0 then
        DestRGB.rgbtRed := Min(255,Gray + Alpha[SrcRGB.rgbtRed])
      else
        DestRGB.rgbtRed := 0;
      if Gray + Alpha[SrcRGB.rgbtGreen]>0 then
        DestRGB.rgbtGreen := Min(255,Gray + Alpha[SrcRGB.rgbtGreen])
      else
        DestRGB.rgbtGreen := 0;
      if Gray + Alpha[SrcRGB.rgbtBlue]>0 then
        DestRGB.rgbtBlue := Min(255,Gray + Alpha[SrcRGB.rgbtBlue])
      else
        DestRGB.rgbtBlue := 0;
      Inc(SrcRGB);
      Inc(DestRGB);
    end;
  end;
  end;

  //RGB調整
  procedure RGBChange(SrcBmp,DestBmp:TBitmap;RedChange,GreenChange,BlueChange:integer);
  var
    SrcRGB, DestRGB: pRGBTriple;
    i,j:integer;
  begin
    for i := 0 to SrcBmp.Height- 1 do
    begin
      SrcRGB := SrcBmp.ScanLine[i];
      DestRGB :=DestBmp.ScanLine[i];
      for j := 0 to SrcBmp.Width - 1 do
      begin
        if RedChange> 0 then
          DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + RedChange)
        else
          DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + RedChange);

        if GreenChange> 0 then
          DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + GreenChange)
        else
          DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + GreenChange);

        if BlueChange> 0 then
          DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + BlueChange)
        else
          DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + BlueChange);
        Inc(SrcRGB);
        Inc(DestRGB);
      end;
    end;
  end;

  如果有些圖像處理的基礎,這些代碼都比較好理解,主要是三原色的值不要超過(0-255)的范圍,有些朋友沒有注意這問題,當超過范圍後,會出現些難看的“色斑”!

  [顏色調整]

  //RGB<=>BGR
  procedure RGB2BGR(const Bitmap:TBitmap);
  var
    X: Integer;
    Y: Integer;
    PRGB: pRGBTriple;
    Color: Byte;
  begin
    for Y := 0 to (Bitmap.Height - 1) do
    begin
      for X := 0 to (Bitmap.Width - 1) do
      begin
        Color := PRGB^.rgbtRed;
        PRGB^.rgbtRed := PRGB^.rgbtBlue;
        PRGB^.rgbtBlue := Color;
        Inc(PRGB);
      end;
      end
    end;
  end;

  //灰度化(加權)
  procedure Grayscale(const Bitmap:TBitmap);
  var
    X: Integer;
    Y: Integer;
    PRGB: pRGBTriple;
    Gray: Byte;
  begin
    for Y := 0 to (Bitmap.Height - 1) do
    begin
      PRGB := Bitmap.ScanLine[Y];
      for X := 0 to (Bitmap.Width - 1) do
      begin
        Gray := (77 * Red + 151 * Green + 28 * Blue) shr 8;
        PRGB^.rgbtRed:=Gray;
        PRGB^.rgbtGreen:=Gray;
        PRGB^.rgbtBlue:=Gray;
        Inc(PRGB);
      end;
    end;
  end;

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