如何改变图像的透明度、亮度和对比度(200分)

  • 主题发起人 主题发起人 Liss
  • 开始时间 开始时间
L

Liss

Unregistered / Unconfirmed
GUEST, unregistred user!
[red]给出完整答案者,在调试通过后给200分[/red]
 
function TForm1.GetB(const Color: TColor): Byte;
begin
Result:=(Color shr 16) and $FF
end;

function TForm1.GetG(const Color: TColor): Byte;
begin
Result:=(Color shr 8) and $FF
end;

function TForm1.GetR(const Color: TColor): Byte;
begin
Result:=Color and $FF
end;
procedure TForm1.ChangeLuma(Image: TImage; const Rate: Double);
var
y, u, v: array [0..351, 0..287] of SmallInt;
r, g, b: array [0..351, 0..287] of Byte;
i, j: Integer;
Color: TColor;
temp: Double;
begin
for i:=0 to Image.Width-1 do
for j:=0 to Image.Height-1 do
begin
Color:=Image.Canvas.Pixels[i, j];
r[i, j]:=GetR(Color);
g[i, j]:=GetG(Color);
b[i, j]:=GetB(Color);
y[i, j]:=Round((r[i, j]*0.299+g[i, j]*0.587+b[i, j]*0.114)*10);
u[i, j]:=Round((r[i, j]*0.596-g[i, j]*0.275-b[i, j]*0.321)*10);
v[i, j]:=Round((r[i, j]*0.212-g[i, j]*0.523+b[i, j]*0.311)*10)
end;
for i:=0 to Image.Width-1 do
for j:=0 to Image.Height-1 do
begin
y[i, j]:=Round(Rate*y[i, j]);
temp:=(y[i, j]+u[i, j]*0.956+v[i, j]*0.621)/10;
if temp<0 then
r[i, j]:=0
else if temp>255 then
r[i, j]:=255
else
r[i, j]:=Round(temp);
temp:=(y[i, j]-u[i, j]*0.272-v[i, j]*0.647)/10;
if temp<0 then
g[i, j]:=0
else if temp>255 then
g[i, j]:=255
else
g[i, j]:=Round(temp);
temp:=(y[i, j]-u[i, j]*1.105+v[i, j]*1.702)/10;
if temp<0 then
b[i, j]:=0
else if temp>255 then
b[i, j]:=255
else
b[i, j]:=Round(temp);
Color:=b[i, j];
Color:=Color shl 8+g[i, j];
Color:=Color shl 8+r[i, j];
Image.Canvas.Pixels[i, j]:=Color
end
end;
不要被yuv误解,它不是yuv图象.
 
to : Liss
留下 EMAIL 地址,发给你。
 
我的e-mail地址是:BlackHawks@etang.com
 
邮件已经发出,请查收!
 
To:Zhihuali
谢谢你提供的程序,不过我问的是怎样调节图像的透明度、亮度和对比度
而你给我的程序是关于调色板的,不是关于图像的
 
去搜索:

http://www.delphibbs.com/delphibbs/dispq.asp?lid=168325
 
To 千堆雪:
可是并没解决问题,那儿最后好像是通过邮件解决的
 
这样的控件一大把!搜索一下都看得你头大!
 
很多完美控件,可以加入多种格式(bmp,jpg...)图,随你调光暗,透明啊[:)]
 
好像都不能彻底地解决问题,对比度变蓝色,亮度无效!还请多多指教!
能否E-Mail给我完整代码?
cinet@163.com
 
这么老的问题!
我有一个例子,要的话发给你
 
我有例子你的邮箱?
 
arcore@163.com
请几位老兄也发我一份,十分感谢。
 
当然要啦,老兄,先谢啦。cinet@163.com
 
图象的亮度调整其实就是RGB三个分量分别增加或者减少相同的数值,代码如下(pf24bit)
procedure TMainForm.GraychangeClick(Sender: TObject);
var
p: PByteArray;
x, y: Integer;
Bmp: TBitmap;

begin
Bmp := TBitmap.Create;
Bmp.Assign(Image1.Picture.Bitmap);
Bmp.PixelFormat := pf24Bit;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to Bmp.Width - 1 do
begin
p[x * 3] := max(0,min(255,(P[3*x]+5)));
p[x * 3 + 1] := max(0,min(255,(P[3*x+1]+5)));
p[x * 3 + 2] := max(0,min(255,(P[3*x+2]+5)));
end
end;
image1.Picture.Bitmap.Assign(Bmp);
bmp.free;
end;
对比度变化其实就是说白的更白,黑的更黑,可以取一个阀值,当对比度增大时,可以
认为是对每一个象素点判断,如果象素值大于阀值则象素值增大一个值,如果小于阀值则
减少一个量,这种效果不是很好。
 
那么怎么改变透明度呢[?]
 
透明是不是应该用Alpha
 
后退
顶部