0

你好!问题是?我有一个要显示的多页 Tiff 文件,并且我使用 BitmapFrame.Thumbnail 属性来显示我的多页 Tiff 文件的每一帧(页面)的小尺寸缩略图。但是<出于某种原因?该属性返回 null。请给出一步一步的描述,这应该怎么做?

我已经尝试使用此方法创建自己的 BitmapSource 缩略图:

public static BitmapImage GetThumbnail(BitmapFrame bitmapFrame)
        {
            try
            {
                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                MemoryStream memorystream = new MemoryStream();
                BitmapImage tmpImage = new BitmapImage();
                encoder.Frames.Add(bitmapFrame);
                encoder.Save(memorystream);
                tmpImage.BeginInit();
                tmpImage.CacheOption = BitmapCacheOption.OnLoad;
                tmpImage.StreamSource = new MemoryStream(memorystream.ToArray());
                File.WriteAllBytes( $"{Path.GetTempFileName()}.jpg", memorystream.ToArray());
                tmpImage.UriSource = new Uri($"{Path.GetTempFileName()}.jpg");
                tmpImage.DecodePixelWidth = 80;
                tmpImage.DecodePixelHeight = 120;
                tmpImage.EndInit();
                memorystream.Close();
                return tmpImage;
            }
            catch (Exception ex)
            {
                return null;
                throw ex;
            }
        } 

然后我将结果转换为 BitmapSource 并使用以下命令创建 BitmapFrames 列表:

List<BitmapFrame> tiffImageList = new List<BitmapFrame>();
tiffImageList.Add(new TiffImage() { index = imageIndex, image = BitmapFrame.Create(frame, (BitmapSource)GetThumbnail(frame))});

最后我尝试获取属性,但它返回null:

foreach (var tiffImage in tiffImageList)
{
   Image image = new Image();
   image.Source = tiffImage.image.Thumbnail;
}
4

1 回答 1

0

我遇到了类似的问题,使用 SDK PhotoViewerDemo 示例进行修改。一些有效的 jpg 显示为白色方形缩略图。

我想我找到了为什么问题代码不起作用。Ivan 的问题提供了正确的 BitmapFrame 构造函数,但函数必须创建 BitmapSource,而不是 BitmapImage。

C# BitmapFrame.Thumbnail 属性对于某些图像为空

我使用 Ivan 对构造函数的调用,使用两个bitmapsource 参数来使用该主题中提供的函数。

我现在使用的 SDK 示例中的代码是..

    private BitmapSource CreateBitmapSource(Uri path)
    {
        BitmapImage bmpImage = new BitmapImage();
        bmpImage.BeginInit();
        bmpImage.UriSource = path;
        bmpImage.EndInit();
        return bmpImage;
    }

    private BitmapSource CreateThumbnail(Uri path)
    {
        BitmapImage bmpImage = new BitmapImage();
        bmpImage.BeginInit();
        bmpImage.UriSource = path;
        bmpImage.DecodePixelWidth = 120;
        bmpImage.EndInit();
        return bmpImage;
    }

    // it has to be plugged in here,
    public Photo(string path)
    {
        Source = path;
        _source = new Uri(path);
        // replaced.. Image = BitmapFrame.Create(_source);
        // with this:
        Image = BitmapFrame.Create(CreateBitmapSource(_source),CreateThumbnail(_source));
        Metadata = new ExifMetadata(_source);
    }
于 2021-12-19T23:59:20.347 回答