41 votes

Existe-t-il une bonne méthode de conversion entre BitmapSource et Bitmap ?

Pour autant que je sache, le seul moyen de convertir une source de bitmap en bitmap est d'utiliser un code non sécurisé... Comme ceci (de Le blog WPF de Lesters ) :

myBitmapSource.CopyPixels(bits, stride, 0);

unsafe
{
  fixed (byte* pBits = bits)
  {
      IntPtr ptr = new IntPtr(pBits);

      System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(
        width,
        height,
        stride,
        System.Drawing.Imaging.PixelFormat.Format32bppPArgb,ptr);

      return bitmap;
  }
}

Pour faire l'inverse :

System.Windows.Media.Imaging.BitmapSource bitmapSource =
  System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
    bitmap.GetHbitmap(),
    IntPtr.Zero,
    Int32Rect.Empty,
    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

Existe-t-il un moyen plus simple dans le framework ? Et quelle est la raison pour laquelle elle n'y figure pas (si elle n'y figure pas) ? Je pense que c'est assez utilisable.

La raison pour laquelle j'en ai besoin est que j'utilise AForge pour effectuer certaines opérations sur les images dans une application WPF. WPF veut afficher BitmapSource/ImageSource mais AForge travaille sur des Bitmaps.

66voto

josef.axa Points 626

Il est possible de se passer de code non sécurisé en utilisant Bitmap.LockBits et copier les pixels de l'image BitmapSource directement à la Bitmap

Bitmap GetBitmap(BitmapSource source) {
  Bitmap bmp = new Bitmap(
    source.PixelWidth,
    source.PixelHeight,
    PixelFormat.Format32bppPArgb);
  BitmapData data = bmp.LockBits(
    new Rectangle(Point.Empty, bmp.Size),
    ImageLockMode.WriteOnly,
    PixelFormat.Format32bppPArgb);
  source.CopyPixels(
    Int32Rect.Empty,
    data.Scan0,
    data.Height * data.Stride,
    data.Stride);
  bmp.UnlockBits(data);
  return bmp;
}

32voto

melvas Points 641

Vous pouvez simplement utiliser ces deux méthodes :

  public static BitmapSource ConvertBitmap(Bitmap source)
    {
        return System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                      source.GetHbitmap(),
                      IntPtr.Zero,
                      Int32Rect.Empty,
                      BitmapSizeOptions.FromEmptyOptions());
    }

    public static Bitmap BitmapFromSource(BitmapSource bitmapsource)
    {
        Bitmap bitmap;
        using (var outStream = new MemoryStream())
        {
            BitmapEncoder enc = new BmpBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(bitmapsource));
            enc.Save(outStream);
            bitmap = new Bitmap(outStream);
        }
        return bitmap;
    }

Il fonctionne parfaitement pour moi

1voto

caesay Points 4760

C'est ce que vous cherchez ?

Bitmap bmp = System.Drawing.Image.FromHbitmap(pBits);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X