【发布时间】:2018-06-12 00:19:21
【问题描述】:
我正在使用这种自定义方法将 Bitmapsource 转换为 Bitmap:
public Bitmap BitmapFromSource(BitmapSource bitmapsource) {
using (MemoryStream outStream = new MemoryStream()) {
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bitmapsource));
enc.Save(outStream);
using (var tempBitmap = new Bitmap(outStream)) {
return new Bitmap(tempBitmap);
} } }
这个方法在我的代码中被调用了好几次,效果很好。 但是当我使用鼠标单击事件或按键事件调用它时,我得到处理程序无效错误。
我不知道如何继续。有什么建议吗?
在代码中我有一个位帧列表:
List<BitmapFrame> myImages = new List<BitmapFrame>();
最初,当我将每一帧显示到几个图片框时,该方法有效:
var handler = new EventHandler(pictureBoxClick);
for (int i = 0; i < (decoder.Frames.Count); i++) {
var picture = new MyPictureBox {
Name = "pictureBoxFrame" + i,
Width = (int)newWidth,
Height = (int)newHeight,
SizeMode = PictureBoxSizeMode.Zoom,
Location= loc,
Image = BitmapFromSource(myImages[i]), };
Controls[i].Click += handler;
splitContainer1.Panel1.Controls.Add(picture);
}
然后当我单击这些图片框之一时:
void pictureBoxClick (object sender , EventArgs e) {
var selectedPictureBox = (PictureBox)sender;
int idx = Controls.IndexOf(selectedPictureBox);
pictureBox1.Image = BitmapFromSource(myImages[idx]);
}
我得到了错误...
【问题讨论】:
-
然后您应该发布负责传递(可能有错误)
BitmapSource的代码。 -
您说这个方法是从多个事件处理程序中调用的。当然,可以调试这些事件中的代码。在那里设置一个断点并查看传递给
BitmapFromSource()方法的内容。因此,您有机会检查您的List<BitmapFrame>并查看它实际包含的内容。如果您发布该代码,就会更容易理解可能出了什么问题。 -
我看不到您将
pictureBoxClick处理程序分配给 PictureBox 控件的Click事件的位置。int idx = Controls.IndexOf(selectedPictureBox);→List<BitmapFrame>索引和Form.Controls数组内的 PictureBox 控件位置之间没有可靠的关系。另外,你不需要它。您可以: 1) 将List<BitmapFrame>索引分配给构造函数中PB 控件的Tag属性。 2)直接分配pictureBox1.Image = (Image)selectedPictureBox.Image.Clone()。无论如何,您应该在使用之前检查myImages[idx]的内容.. -
我添加了事件处理程序。我不介意 'code' List
'code' 索引和 PictureBox 控件在 'code' Form.Controls'code' 数组中的位置之间的关系。每一帧的内容可能会发生变化,所以软件需要重新加载并重新显示所有帧 -
看看我发的能不能用。测试用的sample Form可以从PasteBin下载。
标签: c# bitmapsource