怎样实现对比度与亮度的调节?如同photoshope上的对比度与亮度调节一样。
谢谢!

解决方案 »

  1.   

    [亮度、对比度、饱和度的调整]function Min(a, b: integer): integer;
    begin
      if a < b then
        result := a
      else
        result := b;
    end;function Max(a, b: integer): integer;
    begin
      if a > b then
        result := a
      else
        result := b;
    end;//亮度调整
    procedure BrightnessChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);
    var
      i, j: integer;
      SrcRGB, DestRGB: pRGBTriple;
    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 ValueChange > 0 then
          begin
            DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange);
            DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange);
            DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange);
          end else begin
            DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed + ValueChange);
            DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen + ValueChange);
            DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue + ValueChange);
          end;
          Inc(SrcRGB);
          Inc(DestRGB);
        end;
      end;
    end;//对比度调整
    procedure ContrastChange(const SrcBmp,DestBmp:TBitmap;ValueChange:integer);
    var
      i, j: integer;
      SrcRGB, DestRGB: pRGBTriple;
    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 ValueChange>=0 then
          begin
          if SrcRGB.rgbtRed >= 128 then
            DestRGB.rgbtRed := Min(255, SrcRGB.rgbtRed + ValueChange)
          else
            DestRGB.rgbtRed := Max(0, SrcRGB.rgbtRed - ValueChange);
          if SrcRGB.rgbtGreen >= 128 then
            DestRGB.rgbtGreen := Min(255, SrcRGB.rgbtGreen + ValueChange)
          else
            DestRGB.rgbtGreen := Max(0, SrcRGB.rgbtGreen - ValueChange);
          if SrcRGB.rgbtBlue >= 128 then
            DestRGB.rgbtBlue := Min(255, SrcRGB.rgbtBlue + ValueChange)
          else
            DestRGB.rgbtBlue := Max(0, SrcRGB.rgbtBlue - ValueChange);
          end
          else
          begin
          if SrcRGB.rgbtRed >= 128 then
            DestRGB.rgbtRed := Max(128, SrcRGB.rgbtRed + ValueChange)
          else
            DestRGB.rgbtRed := Min(128, SrcRGB.rgbtRed - ValueChange);
          if SrcRGB.rgbtGreen >= 128 then
            DestRGB.rgbtGreen := Max(128, SrcRGB.rgbtGreen + ValueChange)
          else
            DestRGB.rgbtGreen := Min(128, SrcRGB.rgbtGreen - ValueChange);
          if SrcRGB.rgbtBlue >= 128 then
            DestRGB.rgbtBlue := Max(128, SrcRGB.rgbtBlue + ValueChange)
          else
            DestRGB.rgbtBlue := Min(128, SrcRGB.rgbtBlue - ValueChange);
          end;
          Inc(SrcRGB);
          Inc(DestRGB);
        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;
      

  2.   

    这个代码我有,我要的是photoshape中调节对比度的效果。你先看看!