我有一个PictureBox的图像指向某个文件"A".在执行时我想将PictureBox的图像更改为另一个"B"但我收到以下错误:
"mscorlib.dll中出现'System.IO.IOException'类型的第一次机会异常附加信息:进程无法访问文件"A",因为它正由另一个进程使用."
我将Image设置如下:
pbAvatar.Image = new Bitmap(filePath);
Run Code Online (Sandbox Code Playgroud)
如何解锁第一个文件?
我正在编写一个应用程序,要求我采用专有的位图格式(MVTec Halcon HImage)并将其转换为C#中的System.Drawing.Bitmap.
给我的唯一专有功能是帮助我这样做,这涉及到我写入文件,除了使用"获取指针"功能.
这个功能很棒,它给了我一个指向像素数据,宽度,高度和图像类型的指针.
我的问题是,当我使用构造函数创建System.Drawing.Bitmap时:
new System.Drawing.Bitmap(width, height, stride, format, scan)
Run Code Online (Sandbox Code Playgroud)
我需要指定一个4的倍数的"步幅".这可能是一个问题,因为我不确定我的函数将被命中的大小位图.假设我最终得到一个111x111像素的位图,除了在我的图像中添加一个伪列或减去3列之外,我无法运行此功能.
有没有办法可以绕过这个限制?
我正在尝试从剪贴板保存复制的图像,但它正在丢失其alpha通道:
Image clipboardImage = Clipboard.GetImage();
string imagePath = Path.GetTempFileName();
clipboardImage.Save(imagePath);
Run Code Online (Sandbox Code Playgroud)
如果我从PhotoShop或IE/Firefox/Chrome复制32位图像并运行上面的代码,则输出会丢失其Alpha通道,而是在黑色背景下保存.
图像保存为PNG,可以包含Alpha通道.
正确的数据似乎在剪贴板中,因为粘贴到其他应用程序(例如PhotoShop)会保留alpha通道.
任何人都可以让我摆脱痛苦吗?
提前致谢!
更新:
// outputs FALSE
Debug.WriteLine(Image.IsAlphaPixelFormat(Clipboard.GetImage().PixelFormat));
Run Code Online (Sandbox Code Playgroud)
以上表明,一旦从剪贴板中取出,alpha数据就会丢失.也许我需要以其他方式将其从剪贴板中删除?
Microsoft文档中提供的示例Clipboard.ContainsImage()包括以下内容:
System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
returnImage = Clipboard.GetImage();
....
}
Run Code Online (Sandbox Code Playgroud)
此方法的表面/名义上的行为是首先检查剪贴板是否包含图像,如果是,则获取该图像以供使用。null否则返回。
但是,在ContainsImage()对GetImage() 另一个应用程序的调用与调用之间是否有可能更改了剪贴板的内容?毕竟可能没有图像数据。
当剪贴板不包含图像时,GetImage() 记录为返回null。很好,但是ContainsImage(),如果您在致电GetImage()时必须检查结果,那么首先致电的意义是什么?
这不仅适用于此示例- 如果您实际上需要剪贴板内容,那么调用将有什么用ContainsImage() ?
也许 ...
它比调用更高效GetImage(),因此即使在少数情况下GetImage()失败,它也值得做?
正在进行一些魔术锁定,这将自动解决此问题(高度可疑)?
ContainsImage()如果您不需要获取剪贴板内容,而只是查看它们是否为图像,那么可能是有用的情况。
CF_DIBV5当几个应用程序将透明图像放入剪贴板时,GDI +不支持格式化BUT,它们使用CF_DIBV5(格式17)格式来维护Alpha通道.
.NET Framework无法处理CF_DIBV5格式,因此.NET应用程序无法在剪贴板中放入或检索alpha映像.
是否有任何c#代码支持CF_DIBV5从剪贴板转换位图?
这很奇怪:我最近将工作站从Windows 7升级到Windows10。我有一个Chat客户端,该客户端使用以下代码从剪贴板接受图像:
if (Clipboard.ContainsImage())
{
BitmapSource source = Clipboard.GetImage();
BitmapFrame frame = BitmapFrame.Create(source);
var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
encoder.Frames.Add(frame);
var stream = new MemoryStream();
encoder.Save(stream);
byte[] daten = stream.ToArray();
if (daten != null && daten.Length > 0)
{
sendFile(DateTime.Now.ToString("yyyyMMddHHmmss_") + "clipboard.png", stream.ToArray());
}
}
Run Code Online (Sandbox Code Playgroud)
这是该地区我截图什么要样子(例如,如果我把它粘贴到MS-涂料或直接从截图工具保存):

在使用导入屏幕截图后,现在看起来是这样Clipboard.GetImage();。

如您所见,所有文本都被删除,如果您仔细观察,可以看到通常是白色的背景现在是透明的。
如果我使用JpegBitmapEncoder代替PngBitmapEncoder,它可以正常工作,因此很可能是编码问题,但这让我感到困惑:
c# ×6
clipboard ×4
.net ×3
image ×2
bitmap ×1
constructor ×1
file ×1
gdi+ ×1
locking ×1
picturebox ×1
png ×1
screenshot ×1
windows-10 ×1
winforms ×1