首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ImageSource从3 IntPtr

ImageSource从3 IntPtr
EN

Stack Overflow用户
提问于 2015-11-27 18:10:56
回答 2查看 603关注 0票数 0

我从外部库获得了三个IntPtr到RGB通道数组的IntPtr。目前,我将这三个数组合并为一个,并从新数组创建一个ImageSource。

但是图像可能真的很大(目前高达8000 x 4000 px),因此数据的转换(已经放置在内存中)需要太长时间。

是否有一种方法可以使用这些指针在画布中显示图像而不进行复制?例如,带肋OnRender方法或其他方法的派生类OnRender?

我没有发现任何属于我问题的东西。

更新:当前代码如下所示:

代码语言:javascript
复制
int unmapByes = Math.Abs(stride) - (width * 3);
        byte* _ptrR = (byte*)ptrR;
        byte* _ptrG = (byte*)ptrG;
        byte* _ptrB = (byte*)ptrB;
        BitmapSource bmpsrc = null;
        App.Current.Dispatcher.Invoke(() =>
        {
            bmpsrc = BitmapSource.Create(width,
                                                  height,
                                                  96,
                                                  96,
                                                  PixelFormats.Bgr24,
                                                  null,
                                                  new byte[bytes],
                                                  stride);
        });
        BitmapBuffer bitmapBuffer = new BitmapBuffer(bmpsrc);
        byte* buffer = (byte*)bitmapBuffer.BufferPointer;


        Parallel.For(0, bytes / 3 - height, (offset) =>
        {
            int i = offset * 3 + (((offset + 1) / width)) * unmapByes;
            *(buffer + i) = *(_ptrB + offset);
            *(buffer + i + 1) = *(_ptrG + offset);
            *(buffer + i + 2) = *(_ptrR + offset);
        });
        return bmpsrc;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-13 09:53:16

正确的答案是:

去掉循环中的计算,这有很高的成本。在这种情况下,这是分裂。高成本的计算是CPU指令集中没有的每一种计算。

第二个问题是,一个Parallel.For循环可以提高速度,但前提是循环中的每个线程都有更大的工作量。否则,处理费用太高。

因此,现在我更改了代码,并对每一行使用了一个Parallel.For循环,对这一行中的每个像素使用了一个内部for循环。

现在,我可以转换一个大小为8000x4000,24 1ms,32 my的图像(在我的系统中,我可以说100万像素= 1ms)。

对于未来:每个有问题的人都想知道,为什么他的问题被否决了。如果你不知道答案,或只写牛*t,停止它。

票数 0
EN

Stack Overflow用户

发布于 2015-11-27 18:16:44

WPF图像源实际上是驻留在GPU上的纹理,因此它们必须有非常特定的格式。在这个世界上,你将无法通过你的三个数组。

然而,8000x4000只有32 in (乘以颜色字节),这在RAM中没有什么可复制的。如果你真的把你的减速描述为这一点,我敢打赌你做错了什么(使用List<>或类似的可增长数组,而不是预先分配整个缓冲区,多次重做计算等等)。

作为我头顶上的一个优化提示,我建议不要同时使用3个指针的简单实现,一次做一个数组来将它保存在您的L1缓存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33962836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档