от delphi до C # Image1.Canvas.Pixels - PullRequest
       7

от delphi до C # Image1.Canvas.Pixels

2 голосов
/ 22 января 2010

В 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;

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;
    }

Ответы [ 4 ]

4 голосов
/ 22 января 2010

Младший байт значения Delphi TColor является красным компонентом. Если у вас есть System.Drawing.Bitmap , то вам нужно следующее, которое использует структуру Color , имеющую свойство для красного компонента. Не нужно ничего путаться.

result = original.GetPixel(i, j).R;
3 голосов
/ 22 января 2010
  • Image1.Canvas.Pixels[i, j] определяет цвет одного пикселя.
  • && $000000ff сохраняет только R (ed) из значения RGB.
2 голосов
/ 22 января 2010

В Delphi предполагается получить КРАСНОЕ значение TColor . См. Некоторые цветовые константы в Графическом блоке :

(Большой список можно найти здесь ).

Эти цвета имеют то же значение, что и собственный тип ColorRef , используемый в Windows, который имеет порядок в BGR (синий / зеленый / красный) или системный цвет (см. Ниже). Обратите внимание, что в .NET используется другой тип System.Drawing.Color : порядок: RGB (красный / зеленый / синий) и никаких системных цветов вообще.

Ваш код не будет работать для всех значений TColor, так как TColor может содержать два вида цветов:

  • прямое значение RGB
  • системное значение цвета, которое преобразуется графической системой Windows в пользовательское значение RGB

Чтобы выполнить сопоставление для всех возможных значений, вы должны использовать функцию ColorToRGB в графическом блоке (она преобразует системные цвета в соответствующие значения RGB).

В вашем конкретном случае это, вероятно, работает, поскольку пиксели Canvas не могут содержать системные цвета, только значения RGB.

Но: вы не должны использовать жестко закодированные литералы, такие как $ 000000FF, потому что их значение трудно угадать.

Чтобы получить значения Red / Green / Blue надлежащим образом, вы должны объединить функцию ColorToRGB с этими функциями в устройстве Windows:

function GetRValue(rgb: DWORD): Byte; inline;
function GetGValue(rgb: DWORD): Byte; inline;
function GetBValue(rgb: DWORD): Byte; inline;

Таким образом, вы бы получили такую ​​функцию, чтобы универсально получить часть Red в Delphi:

function GetRed(Color: TColor): Byte;
begin
  Result := GetRValue(ColorToRGB(Color));
end;

На этой странице есть хорошая справка по использованию цвета в Delphi.

- Йерун

2 голосов
/ 22 января 2010

Пиксельные данные почти всегда ARGB в .NET пространстве. Если у вас есть такие пиксельные данные в массиве, вы можете:

UInt32 red = pixels[x+y*w] & 0xFFFF0000

& выполняет поразрядно и . Первый FF предназначен для того, чтобы не трогать альфа-канал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...