从delphi到C#Image1.Canvas.Pixels
在delphi编写的代码中:从delphi到C#Image1.Canvas.Pixels,c#,delphi,C#,Delphi,在delphi编写的代码中: result = (Image1.Canvas.Pixels[i, j] and $000000ff); 这是什么意思? 如果可能的话,请告诉我如何在C#中执行相同的操作 编辑: 我不知道问题在哪里:我使用相同的算法,但结果不相等或相同 .我想我不明白delphi代码是真的 Delphi代码: procedure TForm1.Button1Click(Sender: TObject); var i,j:byte; noise_mass: array [0..2
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;
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;
}
C#代码:
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;
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;
}
私有位图MakeNoise(位图原始)
{
双μ=0.5;
位图newBitmap=新位图(256,256);
双BN=0,BST=0;
字节[,]noise_mass=新字节[256,256];
对于(int i=0;i
Image1.Canvas.Pixels[i,j]
指定一个像素的颜色
和&$000000ff
仅保留RGB值的R(ed)
像素数据在.NET空间中几乎总是ARGB。如果阵列中有此类像素数据,您可以:
UInt32 red = pixels[x+y*w] & 0xFFFF0000
执行。第一个FF用于保持alpha通道未被触及。值的较低字节是红色分量。如果您拥有的是a,那么您需要的是以下内容,它利用了具有红色分量属性的结构。无需任何位旋转
result = original.GetPixel(i, j).R;
在Delphi中,它的意思是获取a的红色值。
请参见中的一些颜色常量:
- =t颜色($000000)
- =t颜色($0000FF)
- =t颜色($00FF00)
- =t颜色($FF0000)
- =t颜色($FFFFFF)
(可以找到更大的列表)
这些颜色与Windows使用的本机类型的值相同,其顺序为BGR(蓝色/绿色/红色)或系统颜色(见下文)。
请注意,.NET使用了不同的类型:顺序为RGB(红色/绿色/蓝色),完全没有系统颜色
您的代码不能适用于所有的TColor值,因为TColor可以包含两种颜色:
- 直接RGB值
- 由Windows图形系统转换为用户定义的RGB值的系统颜色值
为了对所有可能的值进行映射,必须使用(它将系统颜色转换为属性RGB值)
对于您的特定情况,这可能是因为画布的像素不能包含系统颜色,只能包含RGB值
但是:您不应该使用像$000000FF这样的硬编码文本,因为很难猜测它们的含义
要以正确的方式获取红色/绿色/蓝色值,应将ColorToRGB函数与Windows单元中的以下函数结合使用:
function GetRValue(rgb: DWORD): Byte; inline;
function GetGValue(rgb: DWORD): Byte; inline;
function GetBValue(rgb: DWORD): Byte; inline;
因此,在Delphi中,您可以使用这样的函数以通用方式获取红色部分:
function GetRed(Color: TColor): Byte;
begin
Result := GetRValue(ColorToRGB(Color));
end;
对Delphi中的颜色使用有很好的参考价值
--jeroen它返回0到255之间的值?@loviji:结果是这样的。像素作为一个整体返回一个TColor(RGB值)有一件事一直困扰着我,那就是TColor是BGR io RGB。从任何数据包中选取任何颜色选择器,你都会得到一个RGB值。要在Delphi中输入这个值,你需要切换红色和蓝色。也许有人知道这背后的原理,但对我来说,这是一个较低部分的痛苦。Lieven,TColor中的顺序与Windows本机中的顺序相同ColorRef type.Lovij的代码给出的结果与调用API的GetRValue函数的结果相同。Rob,感谢您提供的链接。您还知道Windows的ColorRef type的十六进制形式是BGR的基本原理吗?我返回ARGB值如下。Bitmap original=新位图(pictureBox1.Image);var result=original.GetPixel(i,j).ToArgb()&0xFFFF0000;我认为这是真的。感谢Delphi代码正在以BGR顺序向整数添加值。C#代码正在以RGB顺序向整数添加值。这可以解释为什么没有对图像应用类似外观的噪声。不过,更重要的是,您每次都在使用相同的种子构造一个新的随机类。您可以应将255传递给Next
,而不是Random
。I固定为Random Random=new Random();noise_mass[I,j]=(byte)Random.Next(0,256);