在Delphi中的help-example-jpeg中有

解决方案 »

  1.   

    想要改变图象的对比度、亮度、饱和度,这个很容易: //Bitmap.ScanLine[X] 可以获取图像象素的内存地址,24Bits的Bitmap
    的每一象素是以三原色RGB的次序存放的,改变RGB的值就可调节Bitmap的色彩. 
    // R, G, B: -255~255 
    procedure RGB(var Bmp: TBitmap; R, G, B: Integer); 
    var 
    X, Y: Integer; 
    I: Byte; 
    ColorTable: array[0..255] of TRGBColor; 
    pRGB: PRGBColor; 
    begin 
    for I := 0 to 255 do 
    begin 
    ColorTable[I].R := Byte(I + R); 
    ColorTable[I].G := Byte(I + G); 
    ColorTable[I].B := Byte(I + B); 
    end; for Y := 0 to Bmp.Height - 1 do 
    begin 
    pRGB := Bmp.ScanLine[Y]; 
    for X := 0 to Bmp.Width - 1 do 
    begin 
    pRGB.R := ColorTable[pRGB.R].R; 
    pRGB.G := ColorTable[pRGB.G].G; 
    pRGB.B := ColorTable[pRGB.B].B; 
    end; 
    Inc(pRGB); 
    end; 
    end; // 改变图像的亮度,也只需调用RGB(Bmp, X, X, X)改变三原色. 
    // 调节Bitmap的对比度 
    // 应用公式: 新颜色值 = (旧颜色值 - 128) * 系数 + 128 
    procedure Contrast(var Bmp: TBitmap; Amount: Integer); 
    // Amount: -255~255 
    var 
    X, Y: Integer; 
    I: Byte; 
    ColorTable: array[0..255] of TRGBColor; 
    pRGB: PRGBColor; 
    begin 
    for I := 0 to 126 do 
    begin 
    Y := (Abs(128 - I) * Amount) div 256; 
    ColorTable[I].r := GetRValue(Byte(I - Y)); 
    ColorTable[I].g := GetGValue(Byte(I - Y)); 
    ColorTable[I].b := GetBValue(Byte(I - Y)); 
    end; 
    for I := 127 to 255 do 
    begin 
    Y := (Abs(128 - I) * Amount) div 256; 
    ColorTable[I].r := GetRValue(Byte(I + Y)); 
    ColorTable[I].g := GetGValue(Byte(I + Y)); 
    ColorTable[I].b := GetBValue(Byte(I + Y)); 
    end; 
    for Y := 0 to Bmp.Height - 1 do 
    begin 
    pRGB := Bmp.ScanLine[Y]; 
    for X := 0 to Bmp.Width - 1 do 
    begin 
    pRGB.R := ColorTable[pRGB.R].R; 
    pRGB.G := ColorTable[pRGB.G].G; 
    pRGB.B := ColorTable[pRGB.B].B; 
    Inc(pRGB); 
    end; 
    end; 
    end; // 改变饱和度 
    procedure Saturation(var Bmp: TBitmap; Amount: Integer); // Amount: 0~510 
    var 
    Grays: array[0..767] of Integer; 
    Alpha: array[0..255] of Word; 
    Gray, X, Y: Integer; 
    pRGB: PRGBColor; 
    I: Byte; 
    begin 
    for I := 0 to 255 do Alpha[I] := (I * Amount) 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 Bmp.Height - 1 do 
    begin 
    pRGB := Bmp.ScanLine[Y]; 
    for X := 0 to Bmp.Width - 1 do 
    begin 
    Gray := Grays[pRGB.R + pRGB.G + pRGB.B]; 
    pRGB.R := Byte(Gray + Alpha[pRGB.R]); 
    pRGB.G := Byte(Gray + Alpha[pRGB.G]); 
    pRGB.B := Byte(Gray + Alpha[pRGB.B]); 
    Inc(pRGB); 
    end; 
    end; 
    end;