- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在开发一个应用程序来帮助在我的工作中扫描和显示图像。
我的应用程序是用多个表单构建的,这里最重要的表单是我的mainForm
,用于显示有关当前扫描的统计信息和具有不同功能的菜单条。我还有 ImageViewerForm
和一个 PictureBox
,它显示在辅助监视器上以查看当前扫描的图像。
我正在使用 Timer
轮询图像扫描到的文件夹。扫描新图像并解锁图像后,我会将其抓取到 FileStream
中并将其显示在 PictureBox
中,如下所示:
public static void SetPicture(string filename, PictureBox pb)
{
try
{
Image currentImage;
//currentImage = ImageFast.FromFile(filename);
using (FileStream fsImage = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
currentImage = ScaleImage(Image.FromStream(fsImage), new Size(pb.Width, pb.Height));
if (pb.InvokeRequired)
{
pb.Invoke(new MethodInvoker(
delegate()
{
pb.Image = currentImage;
}));
}
else
{
pb.Image = currentImage;
}
}
}
catch (Exception imageEx)
{
throw new ExceptionHandler("Error when showing image", imageEx);
}
}
public static Image ScaleImage(Image imgToResize, Size size)
{
int sourceWidth = imgToResize.Width;
int sourceHeight = imgToResize.Height;
float nPercent = 0;
float nPercentW = 0;
float nPercentH = 0;
nPercentW = ((float)size.Width / (float)sourceWidth);
nPercentH = ((float)size.Height / (float)sourceHeight);
if (nPercentH < nPercentW)
nPercent = nPercentH;
else
nPercent = nPercentW;
int destWidth = (int)(sourceWidth * nPercent);
int destHeight = (int)(sourceHeight * nPercent);
Bitmap b = new Bitmap(destWidth, destHeight);
using (Graphics g = Graphics.FromImage(b))
{
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
}
return b;
}
这样,PictureBox
中显示的图像不应被锁定,但它确实被锁定了。问题是扫描的图像可能必须重新扫描,如果我这样做,我将在尝试从扫描软件覆盖图像文件时遇到共享冲突错误。
有人知道我能做什么吗?
解决方案
感谢@SPFiredrake,我找到了创建临时文件以显示在 PictureBox 中的解决方案,同时保持原始图像解锁。
public static void SetPicture(string filename, PictureBox pb)
{
try
{
Image currentImage;
//currentImage = ImageFast.FromFile(filename);
using (FileStream fsImage = new FileStream(CreateTempFile(filename), FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
currentImage = ScaleImage(Image.FromStream(fsImage), new Size(pb.Width, pb.Height));
if (pb.InvokeRequired)
{
pb.Invoke(new MethodInvoker(
delegate()
{
pb.Image = currentImage;
}));
}
else
{
pb.Image = currentImage;
}
}
}
catch (Exception imageEx)
{
throw new ExceptionHandler("Error when showing image", imageEx);
}
}
public static string CreateTempFile(string fileName)
{
if (string.IsNullOrEmpty(fileName))
throw new ArgumentNullException("fileName");
if (!File.Exists(fileName))
throw new ArgumentException("Specified file must exist!", "fileName");
string tempFile = Path.Combine(Path.GetTempPath(), Guid.NewGuid() + Path.GetExtension(fileName));
File.Copy(fileName, tempFile);
Log.New("Temp file created: " + tempFile);
return tempFile;
}
最佳答案
这里的问题是图像是从 FileStream 加载的,它被 PictureBox 锁定,因为它持有对流的引用。您应该做的是首先将图片加载到本地内存(通过 byte[] 数组),然后从 MemoryStream 加载图像。在您的 SetPicture
方法中,您应该尝试以下更改并查看它是否有效:
public static void SetPicture(string filename, PictureBox pb)
{
try
{
Image currentImage;
byte[] imageBytes = File.ReadAllBytes(filename);
using(MemoryStream msImage = new MemoryStream(imageBytes))
{
currentImage = ScaleImage(Image.FromStream(msImage), new Size(pb.Width, pb.Height));
....
}
编辑:在我们在 Chat 中进行对话后,更新您最终使用的修复:
public static void SetPicture(string filename, PictureBox pb)
{
try
{
Image currentImage;
string tempFile = Path.Combine(Path.GetTempDirectory(), Guid.NewGuid().ToString() + Path.GetExtension(filename));
File.Copy(filename, tempFile);
//currentImage = ImageFast.FromFile(filename);
using (FileStream fsImage = new FileStream(tempFile, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
...
通过这种方式,您可以使用临时文件实际加载图片框,而不会影响原始文件(在初始副本之外)。
关于c# - 从 PictureBox 解锁图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10431868/
这个问题在这里已经有了答案: Transparent control over PictureBox (8 个答案) 关闭 5 个月前。 我希望 pbGrade 位于 pbItemtype 之上(p
如何将图片框内的图片移动到另一个图片框? 我想用它来移动棋子。我有一个为每个地方拍摄的图片框,所以我有 64 个图片框。 最佳答案 您可以只分配 Image在一个图片框中显示到另一个图片框。如果您随后
大家好,我正在开发跳棋游戏。我有这种宣布获胜者的方法,我希望是否有办法使用循环来做到这一点。目前它工作得很好 :),但我不得不对其进行硬编码而不是使用逻辑。 public void checkWinn
我正在编写一个可以播放幻灯片(以及其他内容)的程序。幻灯片由 backgroundWorker 控制,并设置为 while(true) 循环,因此它将不断播放图像。我的问题是我不确定如何处理旧图像以免
当我在运行时向表单添加图片框时,图片框的行为完全符合我的要求。但是当我将它添加到面板时,图片框会扩展以适合图像。 代码如下: private PictureBox globalPicBox = (Pi
我有一个 PictureBox可以有多种不同的大小(取决于屏幕分辨率、窗口状态等)。我想要适合我的 image到 PictureBox当 image 中的任何一个尺寸(宽度或高度)低于 Picture
我有一个 PictureBox,我在其中使用下面的代码来移动我的对象。我需要在表单中添加一些按钮,但是当我启动程序时,箭头键在按钮之间导航,而不是我的输入按键。我试过很多Form.Load() 上的
我不确定为什么,但每当我处理碰撞时,似乎控件的顶部和左侧属性一切正常,但右侧和底部属性却不太顺利。我不确定是不是因为它们是只读属性,但请有人帮忙。 代码如下 Playground (面板)类
最近想试试AForge.NET因为我发现它非常简单,所以我决定使用 Video.FFMPEG 命名空间来制作一些简单的视频播放,这样我就可以将每一帧直接放在图片框上。仅此一项效果很好,但我想在不重要之
我在主窗体上有两个图片框,一个是来自安装在机器人顶部的网络摄像头的视频流,另一个是一些用户反馈,它不时更新,并带有它认为可以看到的图表(命名 map )。两张图片都可以由任何线程更新。如何安全地更新这
我正在使用 C# 开发一个工具,用于捕获屏幕的一部分并将其放入 PicBox 中,我已经能够获取屏幕截图,但我在某一点上遇到了麻烦。我拍摄的镜头是从屏幕的开头拍摄的,我想给出镜头应该开始的坐标(X,Y
如何将图片设置为 PictureBox在代码中? 下面的代码给出了错误: Cannot implicitly convert Bitmap to String. private void pt
我必须在 C# 中制作一个窗口窗体,其中两个 PictureBox 重叠。 TopPictureBox 包含一个透明的 png 图片。默认情况下,可以通过单击 TopPictureBox 中图像的任何
我正在编写一个简单的游戏 - 贪吃蛇。我想要背景和我的蛇。我认为最好的方法是使用两个 pictureBox(一个有背景,第二个 - 透明,上面有蛇)。 这是个好办法?以及如何将几个小图像(蛇的片段)放
我想在 Winform 应用程序中显示一些图形,它将是股票的图表绘制工具。我认为(但我不确定...)我必须使用 PictureBox,并使用 System.Drawing.Graphics 类的绘图原
我正在为 Windows Mobile (Compact Framework 2.0) 开发一个应用程序。它有一个带 PictureBox 的 WinForms。 我想移动PictureBox的图片,
首先,我要感谢您抽出宝贵时间 :) 所以这是我的问题.. 我正在尝试制作一个小游戏,在其中生成 PictureBox 并将其从右向左发送,然后我的 PictureBox 播放器会尽量避免它们跳跃。所以
我有 pictureBox1, pictureBox2, picturebox3, .... 在 C# 中,有没有办法可以循环更改第一个 picturebox 的背景颜色,然后等待,然后更改 pict
我发现 I. 方法比 II. 方法慢。我的应用程序进行实时图像处理。我知道 C# 对于这个目的来说并不理想,但我可以分离性能关键的东西并在 C++ 中制作它。我想知道为什么在 C# 中没有任何计算的简
我需要在 C# 中绘制费马螺线。我做到了,但我希望我的绘图填充在 PictureBox 中,无论实际尺寸有多大。 public void DrawSpiral(double delta, doub
我是一名优秀的程序员,十分优秀!