首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JPEG XR保存视频帧(UWP C#)

用JPEG XR保存视频帧(UWP C#)
EN

Stack Overflow用户
提问于 2022-09-14 07:31:16
回答 1查看 41关注 0票数 0

我是C#编码的新手,我想用Jpeg-XR (16位图像)保存一个视频帧。我编写了一些应该接近解决方案的代码行,但我只能正确地保存8位映像。

代码语言:javascript
复制
//Use Windows.Media.Editing to get ImageStream
            var clip = await MediaClip.CreateFromFileAsync(file);
            var composition = new MediaComposition();
            composition.Clips.Add(clip);

            var imageStream = await composition.GetThumbnailAsync(Position, (int)frameWidth, (int)frameHeight, VideoFramePrecision.NearestFrame);

            //generate bitmap 
            var writableBitmap = new WriteableBitmap((int)frameWidth, (int)frameHeight);
            writableBitmap.SetSource(imageStream);

            //generate some random name for file in PicturesLibrary
            var name = Position.Minutes.ToString() + "_" + Position.Seconds.ToString() + "_"+ Position.Milliseconds.ToString();
            var saveAsTarget = await KnownFolders.PicturesLibrary.CreateFileAsync(name + file.DisplayName + ".jxr");

            //get stream from bitmap
            const int BytesPerPixel = 4;
            Stream stream = writableBitmap.PixelBuffer.AsStream();
            byte[] pixels = new byte[(int)frameWidth * (int)frameHeight * BytesPerPixel];

            await stream.ReadAsync(pixels, 0, pixels.Length);

            using (var writeStream = await saveAsTarget.OpenAsync(FileAccessMode.ReadWrite))
            {
                var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegXREncoderId, writeStream);
                encoder.SetPixelData(
                    BitmapPixelFormat.Bgra8,
                    BitmapAlphaMode.Premultiplied,
                    (uint)writableBitmap.PixelWidth,
                    (uint)writableBitmap.PixelHeight,
                    96.0,
                    96.0,
                    pixels);
                await encoder.FlushAsync();

                using (var outputStream = writeStream.GetOutputStreamAt(0))
                {
                    await outputStream.FlushAsync();
                }
            }

我试图将BitmapPixelFormat设置为Rgba16,但是结果是一个错误编码的图像。知道怎么解决我的问题吗?

欢迎对我当前代码的替代解决方案。谢谢您:)

EN

回答 1

Stack Overflow用户

发布于 2022-09-14 08:28:25

您不需要手工复制那么多像素,本例使用System.Windows.Media.Imaging命名空间。我不知道uwp中是否有这样的信息:

代码语言:javascript
复制
public static void SaveJxr(this BitmapSource bitmap, Stream stream, byte qualityLevel = 80)
{
    var encoder = new WmpBitmapEncoder();
    encoder.QualityLevel = qualityLevel;
    encoder.Frames.Add(BitmapFrame.Create(bitmap));
    encoder.Save(stream);
}

它使用编码器,但据我所知,这只是Jpeg XR的旧名称。我也相当肯定,当我测试这个的时候,产生的图像实际上是16位。但是你也需要一个可以解码16位图像的工具,而这些看起来并不常见。

如果您同时控制保存和读取端,您可能会考虑使用JpegLS,至少在我测试mono16映像时,这似乎会给出更好的结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73713082

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档