一段图像黑白化的代码(100分)

  • 主题发起人 主题发起人 stigachen
  • 开始时间 开始时间
S

stigachen

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟有一段c++ builder上图像黑白化的代码,现在想转到delphi平台上,有几处不太明白
希望大虾指点
代码如下:
void __fastcall TForm1::Button2Click(TObject *Sender)
{
//图象黑白化
TColor bgr=0;
TColor Cb,Cg,Cr;

for (int i = 0; i < 256; i++)
for (int j = 0; j < 256; j++)
{
bgr=Image1->Canvas->Pixels[j];
Cb=bgr &amp; 0xff;
Cg=bgr &amp; 0xff00; Cg=Cg >> 8;
Cr=bgr &amp; 0xff0000; Cr=Cr >> 16;
WORD w=(Cb+Cg+Cr)/3;

Cb=(TColor)(w);
Cg=(TColor)(w << 8);
Cr=(TColor)(w << 16);

bgr=Cb | Cg | Cr;
Image1->Canvas->Pixels[j] = bgr;
nData[j]=(int)Cb;
}
其中:
Cb=bgr &amp; 0xff;
Cg=bgr &amp; 0xff00; Cg=Cg >> 8;
Cr=bgr &amp; 0xff0000; Cr=Cr >> 16;
WORD w=(Cb+Cg+Cr)/3;
不知如何转成dellphi
 
Cb=bgr &amp; 0xff;
Cg=bgr &amp; 0xff00; Cg=Cg >> 8;
Cr=bgr &amp; 0xff0000; Cr=Cr >> 16;
WORD w=(Cb+Cg+Cr)/3;

delphi了也有求&amp;和求>>的符号,分别是 and 和shr

Operator Operation Operand types Result type Examples
not bitwise negation integer integer not X
and bitwise and integer integer X and Y
or bitwise or integer integer X or Y
xor bitwise xor integer integer X xor Y
shl bitwise shift left integer integer X shl 2
shr bitwise shift right integer integer Y shr I
 
Cg=bgr &amp; 0xff00
我转成Cg:=bgr and 0xff00;
系统报错说缺少分号或操作
 
好像應該寫成
Cb := bgr &amp; #ff00;
 
有人会吗????????
真的很急呀!!!!!!!!!!!!!
 
cb=bgr &amp; 0xff00-> cb:=bgr and $FF00
Cg=Cg >> 8 -> cg:=cg shr 8
 
访问 Canvas.Pixels[][] 很慢,这样也就行了:

procedure ConvertImage(AImage: TImage);
var
p: PByteArray;
Gray,x,y :Integer;
Bmp :TBitmap;
begin
Bmp :=TBitmap.Create; try
Bmp.Assign(AImage.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
Gray:=Round(p[x*3+2]*0.3+p[x*3+1]*0.59+p[x*3]*0.11);
p[x*3]:=Gray;
p[x*3+1]:=Gray;
p[x*3+2]:=Gray;
end;
end;
AImage.Picture.Bitmap.Assign(Bmp);
finally
Bmp.Free;
end;
end;
 
感谢大虾们的帮助,小弟的这个问题已经基本解决了!
不过,才转换代码的过程中小弟又遇到了新的困难,还希望大虾们帮忙到底。
解决后一起结分,分不够小弟另开新贴加分!
同样是C++ builder的代码:
void __fastcall TForm1::Button4Click(TObject *Sender)
{
//DFT G=FgF
int n;
TColor bgr;
TColor Cb,Cg,Cr;
float xx_r,xx_i;
complex<float> g[128][128];
complex<float> F[128][128];
complex<float> G1[128][128];
complex<float> G[128][128];
float fA[128][128],fP[128][128];
for (int i = 0; i < 128; i++)
for (int k = 0; k < 128; k++)
{
xx_r=nData[k];
complex<float> yy1(xx_r,0);
g[k]=yy1;
}
for (int i = 0; i < 128; i++)
for (int k = 0; k < 128; k++)
{
xx_r=cos(2*PI*i*k/128);
xx_i=-sin(2*PI*i*k/128);
complex<float> yy2(xx_r,xx_i);
F[k]=yy2;
}
...
关键是复数部分不好处理,我试过用VarComplexCreate函数,但不知道详细的调用过程,希望大虾们能结合上面的代码详细的说明一下。
 
复数啊,我真的不知道了。上面的代码我看都看不懂,只有等别人来解答了。 :(
 
复数啊?还是用C++方便,要用到DELPHI里,最好还是模仿C++这个模板写一个DELPHI类比较好
 
后退
顶部