Procedure Lightness(Var clip: tbitmap; Amount: Integer); //亮度 Var p0: pbytearray; r, g, b, p, x, y: Integer; Begin For y := 0 To clip.Height - 1 Do Begin p0 := clip.scanline[y]; For x := 0 To clip.Width - 1 Do Begin r := p0[x * 3]; g := p0[x * 3 + 1]; b := p0[x * 3 + 2]; p0[x * 3] := IntToByte(r + ((255 - r) * Amount) Div 255); p0[x * 3 + 1] := IntToByte(g + ((255 - g) * Amount) Div 255); p0[x * 3 + 2] := IntToByte(b + ((255 - b) * Amount) Div 255); End; End; End;Procedure Contrast(Var clip: tbitmap; Amount: Integer); //对比度 Var p0: pbytearray; rg, gg, bg, r, g, b, x, y: Integer; Begin For y := 0 To clip.Height - 1 Do Begin p0 := clip.scanline[y]; For x := 0 To clip.Width - 1 Do Begin r := p0[x * 3]; g := p0[x * 3 + 1]; b := p0[x * 3 + 2]; rg := (Abs(127 - r) * Amount) Div 255; gg := (Abs(127 - g) * Amount) Div 255; bg := (Abs(127 - b) * Amount) Div 255; If r > 127 Then r := r + rg Else r := r - rg; If g > 127 Then g := g + gg Else g := g - gg; If b > 127 Then b := b + bg Else b := b - bg; p0[x * 3] := IntToByte(r); p0[x * 3 + 1] := IntToByte(g); p0[x * 3 + 2] := IntToByte(b); End; End; End;
//示例 procedure TForm1.Button2Click(Sender: TObject); var a: tbitmap; begin a := tbitmap.Create; a.LoadFromFile(MyPath + 'a.bmp'); a.PixelFormat := pf24bit; Lightness(a, 100);//亮度 Form1.Canvas.Draw(0, 0, a); // neues Bild ausgeben / Output new image // InvalidateRect(Form1.Handle, nil, False); RedrawWindow(Form1.Handle, nil, 0, RDW_UPDATENOW);end;
ColorToRGB 函数 把TColor值转换成RGB
ColorToString 函数 把TColor值转换成字符串
CopyPalette 函数 创建一个新的调色板对象以匹配一个已经存在的调色板
CreateGrayMappedBmp 函数 在Bitmap控件中创建一个系统灰度颜色
CreateGrayMappedRes 函数 在Bitmap资源中创建一个系统灰度颜色
CreateMappedBmp 函数 在Bitmap中改变颜色表
CreateMappedRes 函数 在Bitmap资源中改变颜色表
DDBsOnly 变量 判断位图是不是设备相关位图
GetCharSetvalues 过程 设置回调函数(获得字符集)
GetColorvalues 过程 设置回调函数(获得颜色)
GetDefFontCharset 函数 获得默认的系统字体字符集
GetDIB 函数 把设备有关位图转换成设备无关位图
GetDIBSizes 过程 返回设备无关位图的大小
GraphicExtension 函数 获得默认图象对象的扩展文件名
GraphicFileMask 函数 同上(*.bmp等)
GraphicFilter 函数 返回文件过滤器
IdentToCharset 函数 把字符集常数的名字翻译成相应的字符集
IdentToColor 函数 把颜色常数的名字翻译成相应的颜色
StringToColor 函数 把字符串翻译成颜色
SystemPalette16 变量 包含16VGA系统颜色
对比度没有直接的关系,对比度是明暗的对比,你将对比度跳高的话,也就是说亮的越亮,暗的越暗
颜色的分布趋向两端,反之就去向中间。我记得应该是这样吧
这些操作都是通过改变RGB三个分量来实现的
或者它的算法是怎么样的呢?
Var
p0: pbytearray;
r, g, b, p, x, y: Integer;
Begin
For y := 0 To clip.Height - 1 Do Begin
p0 := clip.scanline[y];
For x := 0 To clip.Width - 1 Do
Begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
p0[x * 3] := IntToByte(r + ((255 - r) * Amount) Div 255);
p0[x * 3 + 1] := IntToByte(g + ((255 - g) * Amount) Div 255);
p0[x * 3 + 2] := IntToByte(b + ((255 - b) * Amount) Div 255);
End;
End;
End;Procedure Contrast(Var clip: tbitmap; Amount: Integer); //对比度
Var
p0: pbytearray;
rg, gg, bg, r, g, b, x, y: Integer;
Begin
For y := 0 To clip.Height - 1 Do
Begin
p0 := clip.scanline[y];
For x := 0 To clip.Width - 1 Do
Begin
r := p0[x * 3];
g := p0[x * 3 + 1];
b := p0[x * 3 + 2];
rg := (Abs(127 - r) * Amount) Div 255;
gg := (Abs(127 - g) * Amount) Div 255;
bg := (Abs(127 - b) * Amount) Div 255;
If r > 127 Then r := r + rg Else r := r - rg;
If g > 127 Then g := g + gg Else g := g - gg;
If b > 127 Then b := b + bg Else b := b - bg;
p0[x * 3] := IntToByte(r);
p0[x * 3 + 1] := IntToByte(g);
p0[x * 3 + 2] := IntToByte(b);
End;
End;
End;
procedure TForm1.Button2Click(Sender: TObject);
var
a: tbitmap;
begin
a := tbitmap.Create;
a.LoadFromFile(MyPath + 'a.bmp');
a.PixelFormat := pf24bit;
Lightness(a, 100);//亮度
Form1.Canvas.Draw(0, 0, a); // neues Bild ausgeben / Output new image //
InvalidateRect(Form1.Handle, nil, False);
RedrawWindow(Form1.Handle, nil, 0, RDW_UPDATENOW);end;
谢谢。
to:xzhifei(饭桶超人(抵制日货)) :
我想实现photoshape那种效果,怎么实现?
谢谢。你把参数统一传个两个函数Contrast,Lightness 就可以了。