关于图像亮度/对比度/饱和度?(300分)

  • 主题发起人 主题发起人 cAkk
  • 开始时间 开始时间
C

cAkk

Unregistered / Unconfirmed
GUEST, unregistred user!
查阅以前的讨论,xWolf提供过一个解决方案,在这里:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=168967

但是他的代码在我这里怎么也运行不起来,是不是和机器的显示颜色深度有关?
我现在是16bit颜色,不是24bit.
 
按你给的http://XXXX.XXXX>XXXXXX...我看了一下,头昏了,在我的主页上有一
程序(刚建成,只此一程序)。是有关图形处理的,原理和xWolf说的一样,如你能调试
通过运行,那么可能是他们程序上有什么问题。否则就是你机器问题。(此程序我已
调试通过,通过原代码,你应该知道如何实现对图像亮度/对比度/饱和度的调节)


http://lancewood.163.net/ 自己去取吧!

 
我去看了,是那个图形渐变的程序吗? 好像原理不一样啊?

你能帮我试验一下xWolf的代码吗? 在16bit颜色深度下.
 
不会啊,我的显卡才1兆显存,也只能到16bit
 
好不容易才找到原文:
http://media.ccidnet.com/ciw/849/b1001.htm

http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=168967中还有一处错误:
procedure RGB(var Bmp: TBitmap; R, G, B: Integer);
...


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;
 
我是这样做的,我看到这个bug了,但是还是每次一旦用到pRGB.r,pRGB.g.....
的时候就说"访问了非法的内存地址"

是不是要求图片一定是真彩色的? 256色的行吗?
 
这几个函数处理的都是24bit的位图,如果位图是256色(8bit)的当然要乱了。
另外位图的处理与显示分辨率的深度无关。
 
那么256色的怎么办?
photoshop为什么能处理?
是不是需要先把256转成真彩色再处理?
怎么转?
 
当然要转成24bit了。
256位图文件头有一个颜色索引(就是每象素那个8bit的值)与RGB值的对照表。
读出来就可以转了。
 
FastLib 用过没有?cAkk?
 
问题是我并不想修改文件,只是更改他的显示状态.就像photoshop那样,
就算是256色位图,也可以不用变成24位再操作.

Big_Z: 用过,怎么了? 好像他们的原理都差不多.
 
如果这些算法都只能操作真彩色位图,岂不是没有任何通用性?
 
那就 Bitmap.PixelFormat:=pf24Bit;

就可以用这几个函数处理了。
 
总之,除非显示模式是16色或256色可以通过Palette函数操作,
否则都要转成highcolor,truecolor.
 
>岂不是没有任何通用性?
所有的真彩色位图都可以,是有通用性的,
if 希望你的 Procedure or Function 具有通用性,
就要区别对待
 
Big_Z: 好像很多图像处理控件都没有区别对待呀?

o*o: 你肯定 Bitmap.PixelFormat:=pf24Bit; 管用吗?
 
将图像变为黑白即为改为色彩饱和度的一个极限方法,我做了一色彩饱和度
处理程序,只是速度太慢,我又把它去了,我想有那些应该够了,举一反三嘛!
没办法只好献丑了。
原代码:

procedure TForm4.TrackBar2Change(Sender: TObject);
var
i,j,bmpheight,bmpwidth:integer;
gr,gg,gb,grey:integer;
newBmp:TBitmap;
ch:integer;
begin
Edit2.Text:=inttostr(TrackBar2.Position);
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
for i:=1 to bmpwidth do begin
for j:=1 to bmpheight do begin
gr:=GetRValue(Image1.Canvas.Pixels[i,j]);
gg:=GetGValue(Image1.Canvas.Pixels[i,j]);
gb:=GetBValue(Image1.Canvas.Pixels[i,j]);
grey:=(gr+gg+gb) div 3;
gr:=grey+(gr-grey)div 10*(10+TrackBar2.Position);
gg:=grey+(gg-grey)div 10*(10+TrackBar2.Position);
gb:=grey+(gb-grey)div 10*(10+TrackBar2.Position);
newbmp.Canvas.Pixels[i,j]:=RGB(gr,gg,gb);
end;
form4.Canvas.Draw(50,25,newbmp);
end;
newbmp.free;
end;


注:TrackBar2的最大值为10;最小什值为-10;
 
cAkk,我试过的。你试过吗?
 
procedure TForm4.TrackBar2Change(Sender: TObject);
var
i,j,bmpheight,bmpwidth:integer;
gr,gg,gb,grey:integer;
newBmp:TBitmap;
ch:integer;
begin
Edit2.Text:=inttostr(TrackBar2.Position);
newbmp:= TBitmap.Create;
newbmp.Width:=image1.Width;
newbmp.Height:=image1.Height;
bmpheight:=image1.Height;
bmpwidth:=image1.Width;
for i:=1 to bmpwidth do begin
for j:=1 to bmpheight do begin
gr:=GetRValue(Image1.Canvas.Pixels[i,j]);
gg:=GetGValue(Image1.Canvas.Pixels[i,j]);
gb:=GetBValue(Image1.Canvas.Pixels[i,j]);
<Font Color=#FF0000>grey:=(gr+gg+gb) div 3; // 错了!</Font>
<Font Color=#FF0000>grey:=Round(kr*gr+kg*gg+kb*gb); // 记不清了!</Font>
gr:=grey+(gr-grey)div 10*(10+TrackBar2.Position);
gg:=grey+(gg-grey)div 10*(10+TrackBar2.Position);
gb:=grey+(gb-grey)div 10*(10+TrackBar2.Position);
newbmp.Canvas.Pixels[i,j]:=RGB(gr,gg,gb);
end;
form4.Canvas.Draw(50,25,newbmp);
end;
newbmp.free;
end;
 
>>grey:=Round(kr*gr+kg*gg+kb*gb); // 记不清了!
0.11
0.59
0.30
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部