问题标签 [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.
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))
c# - 有没有在 BitmapSource 和 Bitmap 之间转换的好方法?
据我所知,从 BitmapSource 转换为 Bitmap 的唯一方法是通过不安全的代码......就像这样(来自Lesters WPF 博客):
做相反的事情:
框架中有没有更简单的方法?它不在那里的原因是什么(如果不是)?我认为它是相当可用的。
我需要它的原因是因为我使用 AForge 在 WPF 应用程序中执行某些图像操作。WPF 想要显示 BitmapSource/ImageSource 但 AForge 在位图上工作。
c# - InteropBitmap 到 BitmapImage
我正在尝试将 a 转换Bitmap (SystemIcons.Question)
为 a,BitmapImage
以便可以在 WPF Image 控件中使用它。
我有以下方法将其转换为 a BitmapSource
,但它返回一个InteropBitmapImage
,现在的问题是如何将其转换为 a BitmapImage
。直接演员似乎不起作用。
有人知道怎么做吗?
代码:
返回 BitmapImage 的属性:(绑定到我的图像控件)
wpf - 将 WPF BitmapSource 转换为窗口的图标
我有一个 16x16 .png 文件,我已将其作为 ImageSource (BitmapSource) 加载,当我在 tabcontrol 标头中的 Image 上使用它时它工作正常。
我现在想在用户拖动文档选项卡时在浮动窗口(继承自 WPF Window 类)中使用相同的图像。(这是 AvalonDock,我对其进行了调整以允许标签页眉中的图像)
在网络上进行多次搜索后,我了解到 Window.Icon 需要 BitmapFrame 但所有示例代码似乎都假设 .ico 文件可用,但在我的情况下它不是。
我尝试了以下代码(以及包括克隆、冻结等在内的变体):
但是当调用 Show() 方法时,会抛出异常:“抛出了 'System.ExecutionEngineException' 类型的异常。”
如何动态创建兼容的位图以允许窗口显示图标?
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:“调用线程无法访问此对象,因为不同的线程拥有它。” 带有以下堆栈跟踪:
wpf - 如何将 WPF BitmapSource 图像保存到文件中?
在 WPF 中,System.Windows.Clipboard.getImage()
函数返回一个BitmapSource
对象。作为来自 WinForms 背景的 WPF 新手,我不清楚如何将此图像保存到文件中。我必须采取哪些步骤?
wpf - 在 WPF 中显示字节数组中的图像 - 内存问题
我开发了一个应用程序来捕获图像并将其保存到数据库中,但是我遇到了内存使用问题。在我的域对象上,我有 3 个属性:
图片 - 字节数组,内容为 jpg
RealImageThumb - 转换为 BitmapImage 并缩小的字节数组,在网格视图中与其他缩略图一起显示给用户
RealImage - 没有设置器,将字节数组转换为位图源,当用户将鼠标悬停在它上面时,它会显示在工具提示中。
我遇到的问题是,如果用户依次将鼠标悬停在每个图像上,内存使用量就会呈螺旋式上升。我意识到当用户将鼠标悬停在生成位图源并且内存没有释放时,我尝试给 RealImage 一个支持属性并在之后将其分配给 null 但是内存没有被释放(等待垃圾集电极?)。
编辑:
这就是你说的雷?我没有得到如下工具提示中显示的任何内容,但是如果我尝试定义 a WeakReference<BitmapImage>
,则会收到 System.WeakReference 没有类型参数错误。
wpf - 如何在 WPF 中的现有 BitmapSource 上画一条线?
我想在我的 WPF 应用程序中的现有 BitmapSource 对象上绘制一条线(或任何几何形状)。最好的方法是什么?
BitmapSource 是 BitmapSource.Create(...) 调用的结果。
谢谢
- 罗曼
c# - 在 C# 中创建一个空的 BitmapSource
在 c# 中创建一个空的(0x0 像素或 1x1 像素并且完全透明) BitmapSource实例的最快(几行代码和低资源使用)方法是什么?
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 可能可以做到这一点,但这是一个涉及多个线程的学术练习(在不安全模式下编辑位图时支持)。
提前致谢