programing

비트맵 소스와 비트맵을 변환하는 좋은 방법이 있습니까?

closeapi 2023. 5. 11. 21:28
반응형

비트맵 소스와 비트맵을 변환하는 좋은 방법이 있습니까?

비트맵 소스에서 비트맵으로 변환하는 유일한 방법은 안전하지 않은 코드를 사용하는 것입니다.다음과 같이(Lesters WPF 블로그에서):

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;
  }
}

반대로 하는 방법:

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

프레임워크에서 더 쉬운 방법이 있습니까?그리고 그것이 그 안에 없는 이유는 무엇입니까(그렇지 않다면)?저는 그것이 꽤 유용하다고 생각합니다.

제가 그것을 필요로 하는 이유는 WPF 앱에서 특정 이미지 작업을 수행하기 위해 AForge를 사용하기 때문입니다.WPF는 비트맵 소스/이미지 소스를 표시하려고 하지만 AForge는 비트맵에서 작동합니다.

안전하지 않은 코드를 사용하지 않고 할 수 있습니다.Bitmap.LockBits에서 픽셀을 복사합니다.BitmapSource곧장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;
}

다음 두 가지 방법을 사용할 수 있습니다.

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;
}

저한테 딱 맞습니다.

이것이 당신이 찾는 것입니까?

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

리소스 사전 내의 비트맵 리소스(Windows에서 자주 사용되는 Resources.resx가 아님)에 투명 배경을 설정하는 코드입니다.양식 연령).구성 요소 초기화() 전에 이 메서드를 메서드라고 합니다.위의 melvas의 게시물에는 'ConvertBitmap(비트맵 소스)' 메서드와 BitmapFromSource(비트맵 소스) 메서드가 언급되어 있습니다.

private void SetBitmapResourcesTransparent()
    {
        Image img;
        BitmapSource bmpSource;
        System.Drawing.Bitmap bmp;
        foreach (ResourceDictionary resdict in Application.Current.Resources.MergedDictionaries)
        {
            foreach (DictionaryEntry dictEntry in resdict)
            {
                // search for bitmap resource
                if ((img = dictEntry.Value as Image) is Image 
                    && (bmpSource = img.Source as BitmapSource) is BitmapSource
                    && (bmp = BitmapFromSource(bmpSource)) != null)
                {
                    // make bitmap transparent and assign it back to ressource
                    bmp.MakeTransparent(System.Drawing.Color.Magenta);
                    bmpSource = ConvertBitmap(bmp);
                    img.Source = bmpSource;
                }
            }

        }

    }

이것은 깔끔하고 빛보다 빠릅니다.

  return Imaging.CreateBitmapSourceFromHBitmap( bitmap.GetHbitmap(), IntPtr.Zero,
      Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions() );

두 네임스페이스 간에 픽셀 데이터를 공유할 수 있습니다.변환할 필요가 없습니다.

공유 비트맵 원본을 사용합니다.https://stackoverflow.com/a/32841840/690656

언급URL : https://stackoverflow.com/questions/2284353/is-there-a-good-way-to-convert-between-bitmapsource-and-bitmap

반응형