怎样实现对比度与亮度的调节?如同photoshope上的对比度与亮度调节一样。
谢谢!
谢谢!
解决方案 »
- 赚 分贴
- 怎样才能快速找到delphi中的控件
- 金山office2005是用delphi开发的,讨论一下为什么金山选择Delphi呢?
- 怎么写一个供调用的dll函数啊
- 在ISAPI中用CreateOleObject('Excel.Application')方式使用了Excel,如何确保在使用完毕或出现异常之后能正常释放Excel进程?
- 帮忙了,给分了!!
- 用vc写得dll如何在delphi中调用?参数要如何写?
- 如何获取线程的运行时间(以毫秒为单位)!
- 100分找下载地址
- Kylix有下载吗?D5、D6能否装在一台机器上顺利运行?Win2kprofessional下用D6会有问题吗?
- 线程如何传回数据问题
- 求助,Repository中文怎么翻译?
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;