Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从delphi到C#Image1.Canvas.Pixels_C#_Delphi - Fatal编程技术网

从delphi到C#Image1.Canvas.Pixels

从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

在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..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);