在Delphi編寫的代碼:從德爾福C#Image1.Canvas.Pixels
result = (Image1.Canvas.Pixels[i, j] and $000000ff);
它是什麼意思呢? 如果可能,請說我怎麼能在C#中執行相同的操作?
編輯: 我不知道在哪裏的問題:我使用相同的算法,但結果並不等同或相同 。我覺得我不明白Delphi代碼真!
Delphi代碼:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:byte;
noise_mass: array [0..255,0..255] of byte;
BN,BST:real;
mu:real;
begin
mu:=0.75;
Randomize;
for i:=0 to 255 do
begin
for j:=0 to 255 do
begin
noise_mass[i,j]:=Random(255);
BN:=BN+sqr(noise_mass[i,j]);
BST:=BST+sqr(image1.Canvas.Pixels[i,j] and $000000ff);
end;
end;
for i:=0 to 255 do
begin
for j:=0 to 255 do
begin
image1.Canvas.Pixels[i,j]:=image1.Canvas.Pixels[i,j]+round(mu*noise_mass[i,j]*BST/BN);
end;
end;
end;
C#代碼:
private Bitmap MakeNoise(Bitmap original)
{
double mu = 0.5;
Bitmap newBitmap = new Bitmap(256, 256);
double BN = 0, BST = 0;
byte[,] noise_mass = new byte[256, 256];
for (int i = 0; i <= 255; i++)
{
for (int j = 0; j <= 255; j++)
{
noise_mass[i, j] = (byte)(new System.Random(255)).Next();
BN = BN + Math.Pow(noise_mass[i, j], 2);
BST = BST + Math.Pow(original.GetPixel(i, j).R, 2);
}
}
for (int i = 0; i <= 255; i++)
{
for (int j = 0; j <= 255; j++)
{
int r = original.GetPixel(i, j).ToArgb() + (int)Math.Round(mu * noise_mass[i, j] * BST/BN);
Color c = Color.FromArgb(r);
newBitmap.SetPixel(i, j, c);
}
}
return newBitmap;
}
我的水平是在Delphi :) – loviji 2010-01-22 08:38:16
的Delphi代碼是增加一個值,以在BGR順序的整數零。 C#代碼正在以RGB順序向整數添加一個值。這可以解釋爲什麼你沒有得到應用了類似外觀噪聲的圖像。但更重要的是,你每構建一個使用**相同種子**的新Random類。你應該將255傳遞給'Next',而不是'Random'。 – 2010-01-22 10:27:05
我固定爲Random random = new Random(); noise_mass [i,j] =(byte)random.Next(0,256); – loviji 2010-01-22 10:41:34