相关疑难解决方法(0)

新Bitmap(filePath)锁定的免费文件

我有一个PictureBox的图像指向某个文件"A".在执行时我想将PictureBox的图像更改为另一个"B"但我收到以下错误:

"mscorlib.dll中出现'System.IO.IOException'类型的第一次机会异常附加信息:进程无法访问文件"A",因为它正由另一个进程使用."

我将Image设置如下:

pbAvatar.Image = new Bitmap(filePath);
Run Code Online (Sandbox Code Playgroud)

如何解锁第一个文件?

c# image file picturebox

38
推荐指数
5
解决办法
4万
查看次数

为什么System.Drawing.Bitmap构造函数中的"stride"必须是4的倍数?

我正在编写一个应用程序,要求我采用专有的位图格式(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列之外,我无法运行此功能.

有没有办法可以绕过这个限制?

c# constructor bitmap

22
推荐指数
2
解决办法
2万
查看次数

如何在不丢失.NET中的alpha通道的情况下从剪贴板中获取图像?

我正在尝试从剪贴板保存复制的图像,但它正在丢失其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数据就会丢失.也许我需要以其他方式将其从剪贴板中删除?

.net c# clipboard png image

8
推荐指数
1
解决办法
2万
查看次数

Clipboard.ContainsImage()是否可靠甚至有用?

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()如果您不需要获取剪贴板内容,而只是查看它们是否为图像,那么可能是有用的情况。

.net c# clipboard locking winforms

5
推荐指数
1
解决办法
57
查看次数

如何将CF_DIBV5从剪贴板(Format17)转换为透明位图?

CF_DIBV5当几个应用程序将透明图像放入剪贴板时,GDI +不支持格式化BUT,它们使用CF_DIBV5(格式17)格式来维护Alpha通道.

.NET Framework无法处理CF_DIBV5格式,因此.NET应用程序无法在剪贴板中放入或检索alpha映像.

是否有任何c#代码支持CF_DIBV5从剪贴板转换位图?

.net c# clipboard gdi+

2
推荐指数
1
解决办法
1009
查看次数

在Windows 10上使用Clipboard.GetImage()后从屏幕快照中删除的文本?

这很奇怪:我最近将工作站从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();使用Glipboard.GetImage()后的屏幕截图

如您所见,所有文本都被删除,如果您仔细观察,可以看到通常是白色的背景现在是透明的。

如果我使用JpegBitmapEncoder代替PngBitmapEncoder,它可以正常工作,因此很可能是编码问题,但这让我感到困惑:

  1. 这在Windows 7上从未发生过-Windows 10中发生了哪些变化,可能使屏幕截图有所不同?
  2. 如果我将截图保存到Snipping Tool中的文件中,则会创建一个PNG(数据本身带有PNG-Header)。那么,为什么PNG不是正确的编码?

c# clipboard screenshot image-processing windows-10

1
推荐指数
1
解决办法
537
查看次数