Проблема с преобразованием из растрового изображения в ImageBitmap в C # - PullRequest
0 голосов
/ 10 ноября 2018

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

public static BitmapImage Bitmap2BitmapImage(this Bitmap bitmap)
{
    using (var memory = new MemoryStream())
    {
        bitmap.Save(memory, ImageFormat.Png);
        memory.Position = 0;

        var bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.StreamSource = memory;
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.EndInit();
        bitmapImage.Freeze();

        return bitmapImage;
    }
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018
public Bitmap getRandomTwo()
        {
            Bitmap alone = new Bitmap(1, 2);
            alone.SetPixel(0, 0, Color.White);
            alone.SetPixel(0, 1,Color.Black);
            return alone;
        }

это код для создания растрового изображения

0 голосов
/ 10 ноября 2018

Обновление: Вот метод, который может масштабировать Bitmap без сглаживания.

        public static Bitmap Scale(int count, Bitmap source)
    {
        if (count <= 0) { return source; }
        var bitmap = new Bitmap(source.Size.Width * count, source.Size.Height * count);
        var sourcedata = source.LockBits(new Rectangle(new System.Drawing.Point(0, 0), source.Size), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        var bitmapdata = bitmap.LockBits(new Rectangle(new System.Drawing.Point(0, 0), bitmap.Size), ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
        unsafe
        {
            var srcByte = (byte*)sourcedata.Scan0.ToPointer();
            var dstByte = (byte*)bitmapdata.Scan0.ToPointer();
            for (var y = 0; y < bitmapdata.Height; y++) {
                for (var x = 0; x < bitmapdata.Width; x++) {
                    long index = (x / count) * 4 + (y / count) * sourcedata.Stride;
                    dstByte[0] = srcByte[index];
                    dstByte[1] = srcByte[index + 1];
                    dstByte[2] = srcByte[index + 2];
                    dstByte[3] = srcByte[index + 3];
                    dstByte += 4;
                }
            }
        }
        source.UnlockBits(sourcedata);
        bitmap.UnlockBits(bitmapdata);

        return bitmap;
    }

В этой ситуации вы можете получить правильный BitmapSource с помощью:

   var bitmapSrc = MyImagingHelper.Scale(100,twoPixelBitmap)//this will get a Bitmap size 200 * 100,change the ratio if it is not enough
   .ToBitmapSource();//Convert to bitmap source

Если вы просто хотите преобразовать Bitmap в BitmapSource для отображения в элементах управления WPF, попробуйте этот метод:

    [DllImport("gdi32", EntryPoint = "DeleteObject")]
    public static extern bool DeleteHBitmap(IntPtr hObject);        


    public static BitmapSource ToBitmapSource(this Bitmap target)
    {
        var hbitmap = target.GetHbitmap();
        try {
            return Imaging.CreateBitmapSourceFromHBitmap(hbitmap, IntPtr.Zero, Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());
        }
        finally {
            DeleteHBitmap(hbitmap);
        }
    }

Не игнорируйте вызов DeleteHBitmap!

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