找图象处理控件(具体请进来看看):)(200分)

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

liuyang

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 图象处理的相关控件(最好要有源代码,起码是一个没有使用限制的版本),
它要实现一些功能,包括:图象的 裁切,亮度和 对比度的调整等基本功能。
听说有一个ImageEn控件能实现上述功能,能否有FOR D5的ImageEn控件。
别的控件能实现上述功能也可以。(最好有使用说明)
2.图象显示的相关控件(最好要有源代码,起码是一个没有使用限制的版本),
它要能实现将图象任意角度的 旋转以及缩放功能。(最好有使用说明)

谢谢了,任务比较急,请大家帮忙了。
 
有ImageEn 197 源码,不过只有Delphi 6 的Package, 或者你自己
修改一下 for Delphi5.
如果要,mail to me: workid@163.com
 
我有你要的东西我得email:huazai@zju.edu.cn
 
已经发出
 
给我来一份,谢谢!
519@peoplemail.com.cn
 
好的。我看看。谢谢了。一定给分
 
你的邮箱以满,无法发送,先清空吧
 
有图层控制功能吗?
给我也来一份 ljzhh371@371.NET
 
Graphi32可以么?
 
找找FastBmp,
挺好用的。
 
to huazai
不会吧,SOHU的这个邮箱还有10兆。要不请发到
liuyang@mail.taiji.com.cn
 
FastBmp里的很多算法也可以借鉴
 
liuyang:发出,不知道这回可以吗
 
TO hq_pan AND all
最好有for d5的。谢谢

特别感谢hq_pan,一定给分。
 
我也要:aozhuosen@sina.com
 
以下的内容来自刘斌编著的《C++Builder4高级编程实例精解》
如果你使用Delphi编程,代码你改一改就可以了,以下是C++代码。
1)调整对比度的公式:
Color=(Color-128)*s+128;Color是基色的值,s是调整系数,s>1增加对比度,s<1降低对比度,128是三基色最大值255的中值,图像在对比度调整后平均亮度保持不变.
//-----------------------------------------------------------------------------------------
void TForm1::DoContrast(int s)
{
int XX;
BYTE* ptr;
Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();
tmpBitmap->Assign((TPersistent*)Image->Picture->Graphic);
tmpBitmap->PixelFormat=pf24bit;
for(int y=0;y<tmpBitmap->Height;y++)
{
ptr=(BYTE*)tmpBitmap->ScanLine[y];
for(int x=0;x<tmpBitmap->Width*3;x+=3)
{
XX=((ptr[x+2]-128)*s+12800/100);//注意s的取值范围
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+2]=XX;
XX=((ptr[x+1]-128)*s+12800/100);
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+1]=XX;
XX=((ptr[x]-128)*s+12800/100);
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x]=XX;
}
}
Image->Picture->Graphic=tmpBitmap;
delete tmpBitmap;
}
其中:
#define MIN(A,B) ((A<B)?A:B)
#define MAX(A,B) ((A>B)?A:B)
2)调整图像亮度
void TForm1::DoBright(int b)
{
int XX;
BYTE* ptr;
Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();
tmpBitmap->Assign((TPersistent*)Image->Picture->Graphic);
tmpBitmap->PixelFormat=pf24bit;
for(int y=0;y<tmpBitmap->Height;y++)
{
ptr=(BYTE*)tmpBitmap->ScanLine[y];
for(int x=0;x<tmpBitmap->Width*3;x+=3)
{
XX=ptr[x+2]+b;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+2]=XX;
XX=ptr[x+1]+b;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+1]=XX;
XX=ptr[x]+b;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x]=XX;
}
}
Image->Picture->Graphic=tmpBitmap;
delete tmpBitmap;
}
3)色彩平衡
这里用3个TrackBar分别表示红、绿、蓝平衡,范围都是-100~100;红色的用TrackBar1,其余类推,这3个TrackBar都放在Form2上。
void TForm1::DoBalanceButtonCick(TObject* Sender)
{
int XX;
BYTE* ptr;
Graphics::TBitmap *tmpBitmap=new Graphics::TBitmap();
tmpBitmap->Assign((TPersistent*)Image->Picture->Graphic);
tmpBitmap->PixelFormat=pf24bit;
Form2->TrackBar1->Position=0;
Form2->TrackBar2->Position=0;
Form2->TrackBar3->Position=0;
if(Form2->ShowModal()==IDOK)
{
for(int y=0;y<tmpBitmap->Height;y++)
{
ptr=(BYTE*)tmpBitmap->ScanLine[y];
for(int x=0;x<tmpBitmap->Width*3;x+=3)
{
XX=ptr[x+2]+Form2->TrackBar1->Position;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+2]=XX;
XX=ptr[x+1]+Form2->TrackBar2->Position;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x+1]=XX;
XX=ptr[x]+Form2->TrackBar3->Position;
XX=MAX(XX,0);
XX=MIN(XX,255);
ptr[x]=XX;
}
}
}
4)滤镜方面也有几个,代码较长,你自己找书看吧
 
这么长,没法看了
 
huazai:
请给我发一份, hetianwen@sina.com
 
gz
gaohuaigang@163.com
 
借花献佛:
改变图象的对比度、亮度、饱和度


// 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;
 
后退
顶部