我是C#编码的新手,我想用Jpeg-XR (16位图像)保存一个视频帧。我编写了一些应该接近解决方案的代码行,但我只能正确地保存8位映像。
//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,但是结果是一个错误编码的图像。知道怎么解决我的问题吗?
欢迎对我当前代码的替代解决方案。谢谢您:)
发布于 2022-09-14 08:28:25
您不需要手工复制那么多像素,本例使用System.Windows.Media.Imaging命名空间。我不知道uwp中是否有这样的信息:
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映像时,这似乎会给出更好的结果。
https://stackoverflow.com/questions/73713082
复制相似问题