如何提高图像的亮度?如何画图像的阴影(是柔和的阴影,不是那种全黑的)(100分)

  • 主题发起人 主题发起人 donkey
  • 开始时间 开始时间
D

donkey

Unregistered / Unconfirmed
GUEST, unregistred user!
如何提高图像的亮度?如何画图像的阴影(是柔和的阴影,不是那种全黑的)
 
亮度调整主要是R.G.B各分量的调整,同时增加(减小)相同的幅度,注意不要越界!
一个例子用scanilne实现!
procedure TMainForm.AddbrightClick(Sender: TObject);
var
p: PByteArray;
x, y: Integer;
Bmp: TBitmap;
begin
Bmp := TBitmap.Create;
Bmp.Assign(ChildForm.Image1.Picture.Bitmap);
Bmp.PixelFormat := pf24Bit;
ChildForm.DoubleBuffered := True;
for y := 0 to Bmp.Height - 1 do
begin
p := Bmp.scanline[y];
for x := 0 to (Bmp.Width - 1) do
begin

if (p[x * 3] < 245) and (p[x * 3 + 1] < 245) and (p[x * 3 + 2] <
245) then
begin
p[x * 3] := p[x * 3] + 10;
// R,G,B element increase the same number
p[x * 3 + 1] := p[x * 3 + 1] + 10;
p[x * 3 + 2] := p[x * 3 + 2] + 10;
end;
end;
end;
ChildForm.Image1.Picture.Bitmap.Assign(Bmp);
bmp.free;
end;
end;
 
那如何画阴影呢?
 
用blur算法呗
每个点颜色是上下左右四个点颜色的平均值。 重复计算次数越多, 边界过渡越柔和。一般不超过5次。如果是阴影边界, 2次足够了。
 
老兄,如果是不规则图形,怎么判断它的边界呀?
 
用region呗
我做过哦。 根据不规则形状生成region, 然后将region放大一圈生成一个新的region(为阴影过渡色提供位置), 画阴影时用setcliprgn限制dc里修改的地方, 你画的时候甚至可以将整幅图一起运算(如果你愿意)
 
可否给点具体的提示?
 
RGB => YUV, 然后将 Y 分量乘以一个倍数,就可以调节亮度了,不过小心不要溢出
RGB => Gray 可以得到灰度图案,不知道是不是可以拿来做阴影呢?
 
>>>>RGB => YUV, 然后将 Y 分量乘以一个倍数,就可以调节亮度了,不过小心不要溢出
>>>>RGB => Gray 可以得到灰度图案,不知道是不是可以拿来做阴影呢?
怎么让RGB => YUV,RGB => Gray ?
 
RGB => YUV 带UV空间调整(用于 H.261 等)
Y = (0.257 * R) + (0.504 * G) + (0.098 * B) + 16
Cr = V = (0.439 * R) - (0.368 * G) - (0.071 * B) + 128
Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128
反变换:
B = 1.164(Y - 16) + 2.018(U - 128)
G = 1.164(Y - 16) - 0.813(V - 128) - 0.391(U - 128)
R = 1.164(Y - 16) + 1.596(V - 128)

RGB => YUV 无UV空间调整(用于 JPEG 等)
Y = 0.299R + 0.587G + 0.114B
U'= (B-Y)*0.565
V'= (R-Y)*0.713
反变换
R = Y + 1.403V'
G = Y - 0.344U' - 0.714V'
B = Y + 1.770U'

RGB=>Gray
Gray = R * 0.3 + G * 0.59 + B * 0.11
 
这个问题好,最好有源代码?
 
后退
顶部