Рисование пикселей в WPF

Попробуйте эту apt-get удалить python-криптографию, также вам может потребоваться установить paramiko-1.10.0.tar.gz вручную.

➤ ansible --version ansible 2.1.0

29
задан Jimmy 14 January 2009 в 18:01
поделиться

4 ответа

Я настоятельно рекомендую против предыдущие два предложения. класс WriteableBitmap обеспечивает то, что Вам нужно предположение, что Вы используете 3,5 SP1. Прежде чем SP1 там не является никаким действительно хорошим ответом на этот вопрос в WPF, если Вы не обращаетесь к некоторому серьезному обману.

38
ответ дан 14 October 2019 в 07:38
поделиться

Вы могли поместить 1X1 Прямоугольные объекты на Холст

  private void AddPixel(double x, double y)
  {
     Rectangle rec = new Rectangle();
     Canvas.SetTop(rec, y);
     Canvas.SetLeft(rec, x);
     rec.Width = 1;
     rec.Height = 1;
     rec.Fill = new SolidColorBrush(Colors.Red);
     myCanvas.Children.Add(rec);
  }

, Который должен быть достаточно близок к тому, что Вы хотите

9
ответ дан wegrata 14 October 2019 в 07:38
поделиться

Можно добавить маленький, реагирует, если Вы хотите, но каждым из тех является FrameworkElement, таким образом, это - вероятно, немного тяжеловес. Другая опция состоит в том, чтобы создать себя DrawingVisual, привлечь его, представить его, тогда засовывают его в изображение:

private void DrawRubbish()
{
    DrawingVisual dv = new DrawingVisual();
    using (DrawingContext dc = dv.RenderOpen())
    {
        Random rand = new Random();

        for (int i = 0; i < 200; i++)
            dc.DrawRectangle(Brushes.Red, null, new Rect(rand.NextDouble() * 200, rand.NextDouble() * 200, 1, 1));

        dc.Close();
    }
    RenderTargetBitmap rtb = new RenderTargetBitmap(200, 200, 96, 96, PixelFormats.Pbgra32);
    rtb.Render(dv);
    Image img = new Image();
    img.Source = rtb;
    MainGrid.Children.Add(img);
}
7
ответ дан Steven Robbins 14 October 2019 в 07:38
поделиться

Если вы думаете о том, чтобы сделать что-то вроде трассировщика лучей, где вам нужно будет рисовать много точек, вы, вероятно, захотите нарисовать в памяти растрового изображения пространство напрямую, а не через слои абстракции. Этот код даст вам значительно лучшее время рендеринга, но это достигается за счет необходимости «небезопасного» кода, который может быть или не подходить для вас.


            unsafe
            {
                System.Drawing.Point point = new System.Drawing.Point(320, 240);
                IntPtr hBmp;
                Bitmap bmp = new Bitmap(640, 480);
                Rectangle lockRegion = new Rectangle(0, 0, 640, 480);
                BitmapData data = bmp.LockBits(lockRegion, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
                byte* p;

                p = (byte*)data.Scan0 + (point.Y * data.Stride) + (point.X * 3);
                p[0] = 0; //B pixel
                p[1] = 255; //G pixel
                p[2] = 255; //R pixel

                bmp.UnlockBits(data);

                //Convert the bitmap to BitmapSource for use with WPF controls
                hBmp = bmp.GetHbitmap();
                Canvas.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hbmpCanvas, IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                Canvas.Source.Freeze();
                DeleteObject(hBmp); //Clean up original bitmap
            }

Чтобы очистить hBitmap, вам нужно будет объявить это в верхней части файла класса:


        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

Также обратите внимание, что вам нужно будет установить свойства проекта, чтобы разрешить небезопасный код. Вы можете сделать это, щелкнув правой кнопкой мыши проект в обозревателе решений и выбрав свойства. Перейдите на вкладку Build. Установите флажок «Разрешить небезопасный код». Также я считаю, что вам нужно будет добавить ссылку на System.Drawing.

11
ответ дан 28 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: