delphi中关于对bmp或jpg文件进行图像处理(对比度、亮度调节等)的问题(200分)

  • 主题发起人 主题发起人 吉花
  • 开始时间 开始时间

吉花

Unregistered / Unconfirmed
GUEST, unregistred user!
其实是两个类似的问题:

1、在delphi中的image控件只能显示bmp图片,

我想对这个图片进行一些图像处理,比如:

对比度、亮度调节、RGB调整、甚至最好可以

去噪、去模糊。那么有没有这样的算法或现成

的控件呢?

2、我使用了一个可以显示jpg文件的控件,

那么,有没有算法或现成的控件可以完成上述

的功能的?

综上所述,两点,其一、寻能对bmp图像进行处理

的算法或现成的控件;其二、寻能对jpg图像进行

处理的算法或现成的控件。

拜托各位!
 
有个控件FastBMP可以作到,没在手头上。
 
奇怪,delphi自己的image控件可以显示jpg图片牙!
 
delphi4或5的TImage控件可显示jpg
 
用1stClass自带有Demo到处都能下载,最好的界面组件之一。它上面有一个
Demo就是你说的这种情况。
 
控件的没有, 由几个函数希望能帮上你的忙.

TRGBColor = record R, G, B: Byte; end;
PRGBColor = ^TRGBColor;

// Bitmap.ScanLine[X] 可以获取图像象素的内存地址,24Bits的Bitmap的每一象
// 素是以三原色RGB的次序存放的,改变RGB的值就可调节Bitmap的色彩.
// R, G, B: -255~255
procedure RGB(var Bmp: TBitmap; R, G, B: Integer);
var
X, Y: Integer;
I: Byte;
ColorTable: array[0..255] of TRGBColor
pRGB: PRGBColor;
begin
for I := 0 to 255 do
begin
ColorTable.R := IntToByte(I + R);
ColorTable.G := IntToByte(I + G);
ColorTable.B := IntToByte(I + B);
end;

for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
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;

// 改变图像的亮度,也只需调用RGB(Bmp, X, X, X)改变三原色.
 
// 调节Bitmap的对比度
// 应用公式: 新颜色值 = (旧颜色值 - 128) * 系数 + 128
procedure Contrast(var Bmp: TBitmap; Amount: Integer);
// Amount: -255~255
var // The Same as procedure RGB
begin
for I := 0 to 126 do
begin
Y := (Abs(128 - I) * Amount) div 256;
ColorTable := IntToByte(I - Y);
end;
for I := 127 to 255 do
begin
Y := (Abs(128 - I) * Amount) div 256;
ColorTable := IntToByte(I + Y);
end;
for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
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;
Inc(pRGB);
end;
end;
end;

// 改变饱和度
procedure Saturation(var Bmp: TBitmap; Amount: Integer); // Amount: 0~510
var
Grays: array[0..767] of Integer;
Alpaha: array[0..255] of Word;
Gray, X, Y: Integer;
pGRB: PRGBColor;
I: Byte;
begin
for I := 0 to 255 do Alpha := (I * Amount) shr 8;
x := 0;
for I := 0 to 255 do
begin
Gray := I - Alpha;
Grays[X] := Gray; Inc(X);
Grays[X] := Gray; Inc(X);
Grays[X] := Gray; Inc(X);
end;
for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
for X := 0 to Bmp.Width - 1 do
begin
Gray := Grays[pRGB.R + pRGB.G + pRGB.B];
pRGB.R := IntToByte(Gray + Alpha[RGB.R]);
pRGB.G := IntToByte(Gray + Alpha[RGB.G]);
pRGB.B := IntToByte(Gray + Alpha[RGB.B]);
Inc(pRGB);
end;
end;
end;

对于Jpg的处理,与Bitmap类似,因为TJpegImage内部有TBitmap.

Bmp := TBitmap.Create;
Bmp.Assign(Jpg);
 
以下三种方法可将jpg装入image中
1、Image1.Picture.LoadFromFile('c:/mydocu~1/liu.jpg');

2、
var
jp:TJpegImage;
begin
jp:=TJpegImage.Create;
jp.LoadFromFile('c:/mydocu~1/liu.jpg');
Image1.Picture.Graphic:=jp;
3、
var
jp:TJpegImage;
begin
jp:=TJpegImage.Create;
jp.LoadFromFile('c:/mydocu~1/liu.jpg');

Image1.Picture.Assign(jp);

 
Delphi的目录里好象有个实例吧。(不敢肯定)
 
这里想向xWolf请教:
你给我的程序代码,我实验了一下,由于我是一个新手,
所以,有以下几个问题:
1、Inttobyte这个函数好象没有啊?
2、Contrast(var Bmp: TBitmap; Amount: Integer)
Saturation(var Bmp: TBitmap; Amount: Integer)
RGB(var Bmp: TBitmap; R, G, B: Integer)
这三个过程在程序中怎么使用?
Bmp使用image1.picture.bitmap好象会出错哦?
3、ColorTable := IntToByte(I - Y)
这行代码是否应改为:
with ColorTable do
begin
R:=IntToByte(I-Y);
G:=IntToByte(I-Y);
B:=IntToByte(I-Y);
end;
 
1、将inttobyte换成byte
2、var
bmp:TBitmap;
bmp:=TBitmap.create;
bmp:=Image1.picture.bitmap;

 
Liu JZX:
我在一个button的onclick中这样写:
var bmp:TBitmap;
temp:integer;
begin
bmp:=TBitmap.create;
bmp:=Image1.picture.bitmap;
temp:=strtoint(edit1.text);
RGB(bmp,temp,temp,temp);
Image1.Refresh;
end;
可是image1中的图像没有变化,怎么回事?
 
xWolf的程序对我来说太复杂了,
能否给点注释或解释?
另外,调用这三个过程来显示效果,
发现好象不太对嘛!
不知是什么原因?
 
>可是image1中的图像没有变化,怎么回事?

当然,这一句:
RGB(bmp,temp,temp,temp);
改的是bmp,不是image1
 
真是不好意思,程序中竟有不少错误,我早就从邮件中得知了,
只是我们外面的到这里来不大容易,所以迟迟未能将新程序贴上来.
以下是更正过的程序,我已运行通过:

// Bitmap.ScanLine[X] 可以获取图像象素的内存地址,24Bits的Bitmap的每一象
// 素是以三原色RGB的次序存放的,改变RGB的值就可调节Bitmap的色彩.
// R, G, B: -255~255
procedure RGB(var Bmp: TBitmap; R, G, B: Integer);
var
X, Y: Integer;
I: Byte;
ColorTable: array[0..255] of TRGBColor;
pRGB: PRGBColor;
begin
for I := 0 to 255 do
begin
ColorTable.R := Byte(I + R);
ColorTable.G := Byte(I + G);
ColorTable.B := Byte(I + B);
end;

for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
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;

// 改变图像的亮度,也只需调用RGB(Bmp, X, X, X)改变三原色.
// 调节Bitmap的对比度
// 应用公式: 新颜色值 = (旧颜色值 - 128) * 系数 + 128
procedure Contrast(var Bmp: TBitmap; Amount: Integer);
// Amount: -255~255
var
X, Y: Integer;
I: Byte;
ColorTable: array[0..255] of TRGBColor;
pRGB: PRGBColor;
begin
for I := 0 to 126 do
begin
Y := (Abs(128 - I) * Amount) div 256;
ColorTable.r := GetRValue(Byte(I - Y));
ColorTable.g := GetGValue(Byte(I - Y));
ColorTable.b := GetBValue(Byte(I - Y));
end;
for I := 127 to 255 do
begin
Y := (Abs(128 - I) * Amount) div 256;
ColorTable.r := GetRValue(Byte(I + Y));
ColorTable.g := GetGValue(Byte(I + Y));
ColorTable.b := GetBValue(Byte(I + Y));
end;
for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
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;
Inc(pRGB);
end;
end;
end;

// 改变饱和度
procedure Saturation(var Bmp: TBitmap; Amount: Integer); // Amount: 0~510
var
Grays: array[0..767] of Integer;
Alpha: array[0..255] of Word;
Gray, X, Y: Integer;
pRGB: PRGBColor;
I: Byte;
begin
for I := 0 to 255 do Alpha := (I * Amount) shr 8;
x := 0;
for I := 0 to 255 do
begin
Gray := I - Alpha;
Grays[X] := Gray; Inc(X);
Grays[X] := Gray; Inc(X);
Grays[X] := Gray; Inc(X);
end;
for Y := 0 to Bmp.Height - 1 do
begin
pRGB := Bmp.ScanLine[Y];
for X := 0 to Bmp.Width - 1 do
begin
Gray := Grays[pRGB.R + pRGB.G + pRGB.B];
pRGB.R := Byte(Gray + Alpha[pRGB.R]);
pRGB.G := Byte(Gray + Alpha[pRGB.G]);
pRGB.B := Byte(Gray + Alpha[pRGB.B]);
Inc(pRGB);
end;
end;
end;

//对于Jpg的处理,与Bitmap类似,因为TJpegImage内部有TBitmap.

//Bmp := TBitmap.Create;
//Bmp.Assign(Jpg);

procedure TForm1.FormCreate(Sender: TObject);
begin
bmp := TBitmap.Create;
bmp.Assign(image1.Picture.Graphic);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RGB(Bmp, StrToInt(edit1.text),StrToInt(edit2.text),StrToInt(edit3.text));
image1.Picture.Graphic.Assign(bmp);
image1.Refresh;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Contrast(Bmp, strtoint(edit1.text));
image1.Picture.Graphic.Assign(bmp);
image1.Refresh;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Saturation(Bmp, strtoint(edit1.text));
image1.Picture.Graphic.Assign(bmp);
image1.Refresh;
end;
 
这么多高手都发表乐意见,俺比较懒,这些工作从来都是用一个控件组解决,
叫EnvisionImage什么的,简直可以实现媲美Photoshop的效果,是俺多方比较
的最后选择-还带源代码.哪位需要不妨来个mail说一声.
 
我要!麻烦你发一份给我,多谢了!
我的<a href="mailto:zry@gnetpri.com">Email</a>
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部