【发布时间】:2020-01-01 12:31:38
【问题描述】:
你好!问题是?我有一个多页 Tiff 文件要显示,我使用 BitmapFrame.Thumbnail 属性显示我的多页 Tiff 文件的每一帧(页面)的小尺寸缩略图。但是
我已经尝试使用这种方法创建自己的 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;
}
【问题讨论】:
-
请注意,如果您已经将位图帧编码到 MemoryStream 中,则根本不需要将其写入文件并从该文件中解码另一个图像。只需通过设置新的 BitmapImage 的 StreamSource 属性(如
tmpImage.StreamSource = memoryStream;)直接从 MemoryStream 解码。不要忘记预先倒带流,例如通过将其位置设置为零。 -
我也怀疑创建这些缩略图是否有用。由于您已经解码了全尺寸帧,您可以简单地显示一个带有 ScaleTransform 的 TransformedBitmap。
-
谢谢你的评论,我会尝试改变方法,使用TransformedBitmap等
标签: c# wpf image thumbnails bitmapframe