sipsorcery-org / SIPSorceryMedia.FFmpeg

GNU Lesser General Public License v2.1
31 stars 24 forks source link

Saving as image file from SIPSorceryMedia.Abstractions.RawImage #45

Closed mail2mhossain closed 1 year ago

mail2mhossain commented 1 year ago

How to save a image file from SIPSorceryMedia.Abstractions.RawImage?

Is it possible to create MemoryStream from SIPSorceryMedia.Abstractions.RawImage?

Actually want to convert SIPSorceryMedia.Abstractions.RawImage to Avalonia.Media.Imaging.Bitmap.

Any help in this regard.

mail2mhossain commented 1 year ago

Tried with:

        Bitmap avalonia_bitmap = new Bitmap(Avalonia.Platform.PixelFormat.Rgb565, Avalonia.Platform.AlphaFormat.Premul,
            rawImage.Sample,
            new Avalonia.PixelSize(rawImage.Width, rawImage.Height),
            new Avalonia.Vector(96, 96),
            rawImage.Stride);

but no luck.

If I change Avalonia.Platform.PixelFormat.Bgra8888 or Avalonia.Platform.PixelFormat.Rgba8888, getting error 'Unable to create bitmap from provided data'

mail2mhossain commented 1 year ago

Tried with:

        Bitmap avalonia_bitmap = new Bitmap(Avalonia.Platform.PixelFormat.Rgb565, Avalonia.Platform.AlphaFormat.Premul,
            rawImage.Sample,
            new Avalonia.PixelSize(rawImage.Width, rawImage.Height),
            new Avalonia.Vector(96, 96),
            rawImage.Stride);

but no luck.

If I change Avalonia.Platform.PixelFormat.Bgra8888 or Avalonia.Platform.PixelFormat.Rgba8888, getting error 'Unable to create bitmap from provided data'

mail2mhossain commented 1 year ago

I have converted SIPSorceryMedia.Abstractions.RawImage rawImage to System.Drawing.Bitmap with the following code:

Bitmap bitmap = new Bitmap(rawImage.Width, rawImage.Height, rawImage.Stride, PixelFormat.Format24bppRgb, rawImage.Sample);

After that converted this to Avalonia.Media.Imaging.Bitmap with the following code:

System.Drawing.Bitmap bitmapTmp = new System.Drawing.Bitmap(bitmap); var bitmapdata = bitmapTmp.LockBits(new Rectangle(0, 0, bitmapTmp.Width, bitmapTmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb); Bitmap bitmap1 = new Bitmap(Avalonia.Platform.PixelFormat.Bgra8888, Avalonia.Platform.AlphaFormat.Premul, bitmapdata.Scan0, new Avalonia.PixelSize(bitmapdata.Width, bitmapdata.Height), new Avalonia.Vector(96, 96), bitmapdata.Stride); bitmapTmp.UnlockBits(bitmapdata); bitmapTmp.Dispose();

AND it is working in Windows platform. To work in cross-platform (Win, Linux, OSX), I want to convert SIPSorceryMedia.Abstractions.RawImage rawImage to Avalonia.Media.Imaging.Bitmap directly. Any help in this regards?

mail2mhossain commented 1 year ago

If I can get IList bgraPixelData from SIPSorceryMedia.Abstractions.RawImage then it can be converted to Avalonia.Media.Imaging.WriteableBitmap

public static WriteableBitmap CreateBitmapFromPixelData ( IList bgraPixelData, int pixelWidth, int pixelHeight) { Vector dpi = new Vector(96, 96);

        var bitmap = new WriteableBitmap(
            new PixelSize(pixelWidth, pixelHeight),
            dpi,
            Avalonia.Platform.PixelFormat.Rgba8888,
            AlphaFormat.Premul);

        // Warning: This is highly questionable
        using (var frameBuffer = bitmap.Lock())
        {
            Marshal.Copy(bgraPixelData.ToArray(), 0, frameBuffer.Address, bgraPixelData.Count);
        }

        return bitmap;
    }

In SIPSorceryMedia.Abstractions.PixelConverter class there are several pixel format conversion functions. But I am looking for RGBToBGRA. Any Help?

ChristopheI commented 1 year ago

Nearly the same question than #47

Please read my answer: https://github.com/sipsorcery-org/SIPSorceryMedia.FFmpeg/issues/47#issuecomment-1354346985