问题标签 [bitmapsource]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2787 浏览

wpf - WPF/BackgroundWorker 和 BitmapSource 问题

我是 WPF 的初学者,正在尝试一个家庭项目来熟悉这项技术。我有一个简单的表单,用户选择一个图像文件,然后我显示 EXIF 数据以及图像的缩略图。这工作正常,但是当我选择一个 RAW 图像文件(~9 MB)时,拇指加载时可能会有一点延迟,所以我想我可以使用 BackgroundWorker 来解码图像并且用户可以查看 EXIF 数据,然后图像解码后显示。

BitmapSource 对象在 BackgroundWorkers DoWork 方法中声明:

我遇到的问题是,当我尝试在 RunWorkerCompleted 方法中设置 Image 控件的源时,我收到一个错误,因为该对象由另一个线程拥有。

我尝试使用该imgThumb.Dispatcher.BeginInvoke()方法设置源,但这也不起作用,我想这是因为它args.Result是另一个线程拥有的,而不是imgThumb? 我怎样才能绕过这个?

可能是我的 Dispatcher 编码错误(以下内容来自记忆,我删除了我拥有的内容)。

欢迎任何建议或想法。

更新

将我的 DoWork 方法更改为使用 BitmapCreateOptions.None 而不是 .DelayCreation 但现在在加载 RAW 文件时出现以下错误(我迄今为止测试过的所有文件都是佳能 .CR2 文件),该代码适用于 jpg 文件。这可能是我安装的佳能编解码器允许我显示 RAW 文件的问题吗?

应用程序调用了为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))

0 投票
6 回答
64091 浏览

c# - 有没有在 BitmapSource 和 Bitmap 之间转换的好方法?

据我所知,从 BitmapSource 转换为 Bitmap 的唯一方法是通过不安全的代码......就像这样(来自Lesters WPF 博客):

做相反的事情:

框架中有没有更简单的方法?它不在那里的原因是什么(如果不是)?我认为它是相当可用的。

我需要它的原因是因为我使用 AForge 在 WPF 应用程序中执行某些图像操作。WPF 想要显示 BitmapSource/ImageSource 但 AForge 在位图上工作。

0 投票
3 回答
10335 浏览

c# - InteropBitmap 到 BitmapImage

我正在尝试将 a 转换Bitmap (SystemIcons.Question)为 a,BitmapImage以便可以在 WPF Image 控件中使用它。

我有以下方法将其转换为 a BitmapSource,但它返回一个InteropBitmapImage,现在的问题是如何将其转换为 a BitmapImage。直接演员似乎不起作用。

有人知道怎么做吗?

代码:

返回 BitmapImage 的属性:(绑定到我的图像控件)

0 投票
2 回答
2836 浏览

wpf - 将 WPF BitmapSource 转换为窗口的图标

我有一个 16x16 .png 文件,我已将其作为 ImageSource (BitmapSource) 加载,当我在 tabcontrol 标头中的 Image 上使用它时它工作正常。

我现在想在用户拖动文档选项卡时在浮动窗口(继承自 WPF Window 类)中使用相同的图像。(这是 AvalonDock,我对其进行了调整以允许标签页眉中的图像)

在网络上进行多次搜索后,我了解到 Window.Icon 需要 BitmapFrame 但所有示例代码似乎都假设 .ico 文件可用,但在我的情况下它不是。

我尝试了以下代码(以及包括克隆、冻结等在内的变体):

但是当调用 Show() 方法时,会抛出异常:“抛出了 'System.ExecutionEngineException' 类型的异常。”

如何动态创建兼容的位图以允许窗口显示图标?

0 投票
4 回答
4803 浏览

c# - 如何将 DispatcherObject (BitmapSource) 复制到不同的线程中?

我试图弄清楚如何将 DispatcherObject(在我的情况下为 BitmapSource)复制到另一个线程中。

用例:
我有一个 WPF 应用程序需要在新线程中显示窗口(该应用程序实际上是 Outlook 插件,我们需要这样做,因为 Outlook 在主 UI 线程中有一些钩子,并且正在窃取我们需要使用的某些热键- Outlook、WPF(我们用于 UI)和 Winforms(我们需要使用某些 microsoft 提供的 winforms 控件)的互操作中“丢失翻译”)。

这样,我就有了 WPFMessageBox 的实现,它是通过设置一些静态属性来配置的——其中之一是用于图标的 BitmapSource。使用它是为了在启动时我可以设置 WPFMessageBox.Icon 一次,从那时起,每个 WPFMessageBox 都将具有相同的图标。

问题是分配给icon的BitmapSource是一个DispatcherObject,读取时会抛出InvalidOperationException:“调用线程无法访问这个对象,因为不同的线程拥有它。”。

如何将该 BitmapSource 克隆到实际线程中?它有 Clone() 和 CloneCurrentValue() 方法,它们不起作用(它们也抛出相同的异常)。我还想到使用 originalIcon.Dispatcher.Invoke(在此处进行克隆)-但 BitmapSource 的 Dispatcher 为空,并且仍然-我会在错误的线程上创建副本,但仍然无法在我的线程上使用它。BitmapSource.IsFrozen == 真。

关于如何将 BitmapSource 复制到不同的线程中的任何想法(没有从新线程中的图像文件完全重建它)?

编辑: 所以,冻结没有帮助:最后我有一个 BitmapFrame (Window.Icon 无论如何都不采用任何其他类型的 ImageSource),当我将它分配为 Window.Icon 在不同的线程上,即使冻结,我得到 InvalidOperationException:“调用线程无法访问此对象,因为不同的线程拥有它。” 带有以下堆栈跟踪:

0 投票
2 回答
54772 浏览

wpf - 如何将 WPF BitmapSource 图像保存到文件中?

在 WPF 中,System.Windows.Clipboard.getImage()函数返回一个BitmapSource对象。作为来自 WinForms 背景的 WPF 新手,我不清楚如何将此图像保存到文件中。我必须采取哪些步骤?

0 投票
1 回答
5248 浏览

wpf - 在 WPF 中显示字节数组中的图像 - 内存问题

我开发了一个应用程序来捕获图像并将其保存到数据库中,但是我遇到了内存使用问题。在我的域对象上,我有 3 个属性:

图片 - 字节数组,内容为 jpg

RealImageThumb - 转换为 BitmapImage 并缩小的字节数组,在网格视图中与其他缩略图一起显示给用户

RealImage - 没有设置器,将字节数组转换为位图源,当用户将鼠标悬停在它上面时,它会显示在工具提示中。

我遇到的问题是,如果用户依次将鼠标悬停在每个图像上,内存使用量就会呈螺旋式上升。我意识到当用户将鼠标悬停在生成位图源并且内存没有释放时,我尝试给 RealImage 一个支持属性并在之后将其分配给 null 但是内存没有被释放(等待垃圾集电极?)。

编辑:

这就是你说的雷?我没有得到如下工具提示中显示的任何内容,但是如果我尝试定义 a WeakReference<BitmapImage>,则会收到 System.WeakReference 没有类型参数错误。

0 投票
1 回答
1787 浏览

wpf - 如何在 WPF 中的现有 BitmapSource 上画一条线?

我想在我的 WPF 应用程序中的现有 BitmapSource 对象上绘制一条线(或任何几何形状)。最好的方法是什么?

BitmapSource 是 BitmapSource.Create(...) 调用的结果。

谢谢

  • 罗曼
0 投票
6 回答
19162 浏览

c# - 在 C# 中创建一个空的 BitmapSource

在 c# 中创建一个空的(0x0 像素或 1x1 像素并且完全透明) BitmapSource实例的最快(几行代码和低资源使用)方法是什么?

0 投票
1 回答
2839 浏览

c# - 是否可以从另一个线程“不安全”地修改内存中的 WPF BitmapSource

我想在 WPF 应用程序中对图像进行一些处理。但是,我想在运行时修改内存中 BitmapSource 的像素。

我目前正在设法使用针对老式 System.Drawing.Bitmap 的“不安全”代码来执行此操作,并且它可以完成工作(锁定工作区域,摆弄像素)。该方法在这篇文章中进行了描述:http: //blogs.msdn.com/b/ericgu/archive/2007/06/20/lost-column-2-unsafe-image-processing.aspx

为了让它在 WPF 中工作,我使用这种方法创建了一个 WPF BitmapSource:

但是,这会在内存中创建大量副本,我真的很想进入其中并摆弄 BitmapSource 中的底层位,就像 EricGu 在 Bitmap 示例中显示的那样。这可能吗?

我意识到 PixelShaders 可能可以做到这一点,但这是一个涉及多个线程的学术练习(在不安全模式下编辑位图时支持)。

提前致谢