C # winforms код для C # wpf кода - PullRequest
1 голос
/ 02 октября 2010

У меня есть приложение для рисования, разработанное в Winforms C #, которое использует много объектов System.Drawing.Bitmap во всем коде.

Теперь я пишу это в WPF с помощью c #. Я сделал почти 90% конверсии.

Приступая к проблеме ... У меня есть следующий код, который используется для прохождения изображения пиксель за пикселем

Bitmap result = new Bitmap(img); // img is of System.Drawing.Image
result.SetResolution(img.HorizontalResolution, img.VerticalResolution);
BitmapData bmpData = result.LockBits(new Rectangle(0, 0, result.Width, result.Height), ImageLockMode.ReadWrite, img.PixelFormat);

int pixelBytes = System.Drawing.Image.GetPixelFormatSize(img.PixelFormat) / 8;
System.IntPtr ptr = bmpData.Scan0;

int size = bmpData.Stride * result.Height;
byte[] pixels = new byte[size];

int index = 0;
double R = 0;
double G = 0;
double B = 0;

System.Runtime.InteropServices.Marshal.Copy(ptr, pixels, 0, size);

for (int row = 0; row <= result.Height - 1; row++)
  {
   for (int col = 0; col <= result.Width - 1; col++)
   {
     index = (row * bmpData.Stride) + (col * pixelBytes);
     R = pixels[index + 2];
     G = pixels[index + 1];
     B = pixels[index + 0];
    .
    .// logic code
    .
    }
  }

result.UnlockBits(bmpData); 

Для этой цели используется System.Drawing.

Можно ли достичь этой цели в wpf и сохранить ее простой, как она есть?

Ответы [ 2 ]

1 голос
/ 02 октября 2010

В дополнение к ответу Криса вы можете посмотреть WriteableBitmap . Это еще один способ манипулирования изображениями пикселей.
Пример

1 голос
/ 02 октября 2010

Вы можете использовать BitmapImage.CopyPixels , чтобы скопировать изображение в ваш пиксельный буфер.

BitmapImage img= new BitmapImage(...); // This is your image

int bytePerPixel = (img.Format.BitsPerPixel + 7) / 8;
int stride = img.PixelWidth * bytesPerPixel;
int size = img.PixelHeight * stride;
byte[] pixels = new byte[size];

img.CopyPixels(pixels, stride, 0);

// Now you can access 'pixels' to perform your logic
for (int row = 0; row < img.PixelHeight; row++) 
{ 
   for (int col = 0; col < img.PixelWidth; col++) 
   { 
     index = (row * stride) + (col * bytePerPixel ); 
     ...
   } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...