locked
Есть ли в WPF эффективный метод что бы рисовать графику на пиксельном уровне? RRS feed

  • Общие обсуждения

  • WPF обеспечивает набор графических примитивов таких как фигуры , визуализацию, рисование, геометрию (Visuals, Drawings, Geometries) и тд. Чтобы отобразить визуальное содержимое, но иногда вам может понадобиться управлять графикой на пиксельному уровне. Наиболее эффективный способ в текущей версии WPF что бы рисовать на пиксельном уровне это использование Imaging.CreateBitmapSourceFromMemorySection() метода, пример:

    using System;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Interop;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Runtime.InteropServices;
    
    namespace MemSectionBitmapExample
    {
        class Example : Window
        {
            public Example()
            {
                SizeToContent = SizeToContent.WidthAndHeight;
                int pixelWidth = 20, pixelHeight = 20;
                uint numPixels = (uint)(pixelWidth * pixelHeight);
                uint numBytes = numPixels * 4;
    
                // Create a new file mapping object to back our bitmap.
                IntPtr section = CreateFileMapping(INVALID_HANDLE_VALUE,
                                                   IntPtr.Zero,
                                                   PAGE_READWRITE,
                                                   0,
                                                   numBytes,
                                                   null);
    
                // Just so we can tell that everything is actually working, write
                // the color red to each pixel of the bitmap.
                unsafe
                {
                    int* vptr = (int*)MapViewOfFile(section,
                                                    FILE_MAP_ALL_ACCESS,
                                                    0,
                                                    0,
                                                    numBytes).ToPointer();
    
                    for (int i = 0; i < numPixels; i++)
                    {
                        vptr[i] = 0xFF0000;
                    }
                }
    
                int stride = (pixelWidth * PixelFormats.Bgr32.BitsPerPixel + 7) / 8;
    
                // Create a bitmap source using the memory section we got
                // from CreateFileMapping
                BitmapSource bitmapSource
                  = Imaging.CreateBitmapSourceFromMemorySection(section,
                                                                pixelWidth,
                                                                pixelHeight,
                                                                PixelFormats.Bgr32,
                                                                stride,
                                                                0);
    
                // Set our BitmapSource as the source of a new Image so
                // that we can display it.
                Image image = new Image();
                image.Width = image.Height = 300;
                image.Source = bitmapSource;
                Content = image;
            }
    
            [STAThread]
            public static void Main()
            {
                Application app = new Application();
                app.Run(new Example());
            }
    
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern IntPtr CreateFileMapping(IntPtr hFile,
                                                   IntPtr lpFileMappingAttributes,
                                                   uint flProtect,
                                                   uint dwMaximumSizeHigh,
                                                   uint dwMaximumSizeLow,
                                                   string lpName);
    
            [DllImport("kernel32.dll", SetLastError = true)]
            static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject,
    
                                               uint dwDesiredAccess,
                                               uint dwFileOffsetHigh,
                                               uint dwFileOffsetLow,
                                               uint dwNumberOfBytesToMap);
    
            // Windows constants
            uint FILE_MAP_ALL_ACCESS = 0xF001F;
            uint PAGE_READWRITE = 0x04;
            IntPtr INVALID_HANDLE_VALUE = new IntPtr(-1);
        }
    }
    

    Для связи [Mail]
    • Изменен тип I.VorontsovModerator 17 марта 2010 г. 13:27
    • Перемещено Tagore Bandlamudi 2 октября 2010 г. 22:54 MSDN Forums consolidation (От:Разработка Windows-приложений)
    17 марта 2010 г. 13:27
    Модератор