标签: writeablebitmap

为什么我的不安全代码阻塞比我的安全代码慢?

我正在尝试编写一些能够方便地处理视频帧的代码.我收到框架作为System.Windows.Media.Imaging.WriteableBitmap.出于测试目的,我只是应用一个简单的阈值滤波器来处理BGRA格式图像,并根据BGR像素的平均值将每个像素分配为黑色或白色.

这是我的"安全"版本:

public static void ApplyFilter(WriteableBitmap Bitmap, byte Threshold)
{
    // Let's just make this work for this format
    if (Bitmap.Format != PixelFormats.Bgr24
        && Bitmap.Format != PixelFormats.Bgr32)
    {
        return;
    }

    // Calculate the number of bytes per pixel (should be 4 for this format). 
    var bytesPerPixel = (Bitmap.Format.BitsPerPixel + 7) / 8;

    // Stride is bytes per pixel times the number of pixels.
    // Stride is the byte width of a single rectangle row.
    var stride = Bitmap.PixelWidth …
Run Code Online (Sandbox Code Playgroud)

c# unsafe writeablebitmap

7
推荐指数
2
解决办法
3253
查看次数

如何从RenderTargetBitmap bitblit到WriteableBitmap?

我正在渲染RenderTargetBitmap的几十个视觉效果.每个都在它自己的Rect中呈现.我想要做的是将RenderTargetBitmap实例渲染的这些Rect区域之一复制到WriteableBitmap的同一区域...快速复制rect像素或smth.像那样.

那么,有没有办法以快速的方式将Rect从RenderTargetBitmap复制到WriteableBitmap?

wpf writeablebitmap rendertargetbitmap

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

如何将WriteableBitmap对象转换为WPF中的BitmapImage对象

如何在WPF中将WriteableBitmap对象转换为对象BitmapImage

这个链接涵盖了silverlight,WPF中的进程不一样,WriteableBitmap对象没有SaveJpeg方法.

所以我的问题是如何在WPF中将WriteableBitmap对象转换为对象BitmapImage

wpf bitmapimage writeablebitmap

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

OutOfMemoryException @ WriteableBitmap @后台代理

我有一个Windows Phone 8应用程序,它使用后台代理:

  1. 从互联网获取数据;
  2. 基于用户控件生成图像,该用户控件使用步骤1中的数据作为数据源;
  3. 在用户控件中,我有Grid&StackPanel和一些文本和图像控件;
  4. 当某些图像使用安装文件夹中的本地资源(/ Assets/images/...)时,用户从手机的照片库中选择了我用作背景的其中一个,因此我必须使用C#设置源代码背后.

但是,当它在后台运行时,它会得到OutOfMemoryException一些故障排除:

  1. 当我在"前线"中运行该过程时,一切正常;
  2. 如果我注释掉更新进度,并直接创建图像,它也可以正常工作;
  3. 如果我没有设置背景图像,它也可以正常工作;
  4. OutOfMemoryException在期间抛出var bmp = new WriteableBitmap(480, 800);
    我已经缩水为1280*768到800*480的图像大小,我认为这是一个全屏幕的背景图像的底线,不是吗?
  5. 经过一些研究,我发现出现这个问题是因为它超过了周期性任务的11 MB限制.
  6. 我试过DeviceStatus.ApplicationCurrentMemoryUsage用来跟踪内存使用情况:

    - 限制是11,534,336(位)

    - 当后台代理启动时,即使没有任何任务,内存使用量也变为4,648,960

    - 从互联网获得更新时,它增长到5,079,040

    - 完成后,它回落到4,648,960

    - 当调用开始时(从用户控件生成图像),它增长到8,499,200

嗯,我想这就是问题所在,它几乎没有可用于渲染图像的内存WriteableBitmap.

知道如何解决这个问题吗?

有没有更好的方法从用户控件/或其他任何东西生成图像?

实际上原始图像可能只有100 kb左右,但是,在渲染时WriteableBitmap,文件大小(以及我猜想的所需内存大小)可能会增长到1-2MB.

或者我可以从任何地方释放内存吗?

================================================== ============

顺便说一下,当这个Code Project文章说我在周期性任务中只能使用11MB内存时;

但是,这篇MSDN文章说我可以使用Windows Phone 8 Update 3最多20 MB或25 MB; 哪个是对的?为什么我处于第一种情况?

================================================== ============

编辑:

说到调试器,它在MSDN文章中也有说明:

When running under the debugger, memory and timeout restrictions …

c# writeablebitmap windows-phone-8

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

WPF WriteableBitmap内存泄漏?

我正在试图找出如何释放WriteableBitmap内存.

在下一部分代码中,我填充了一个WriteableBitmap的后备缓冲区,其中包含来自"BigImage"(3600*4800 px,仅用于测试)的大量数据.如果我评论位图和图像等于null的行,那么内存即使不再使用图像和位图,它也不会发布,应用程序消耗大约230 MB!

正如您在代码末尾所看到的,调用GC.Collect()来释放内存是必要的.

所以问题是,释放WriteableBitmap对象使用的内存的正确方法是什么?GC.Collect()是唯一的方法吗?

任何帮助都会很棒.

PS.对不起,我的英语不好.

private void buttonTest_Click(object sender, RoutedEventArgs e)
{
            Image image = new Image();
            image.Source = new BitmapImage(new Uri("BigImage"));

            WriteableBitmap bitmap = new WriteableBitmap(
                (BitmapSource)image.Source);

            bitmap.Lock();

            // Bitmap processing

            bitmap.Unlock();

            image = null;
            bitmap = null;

            GC.Collect();
}
Run Code Online (Sandbox Code Playgroud)

wpf memory-leaks writeablebitmap

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

在WriteableBitmap上绘图

我有一个WriteableBitmap,并希望用户能够绘制它,就像它是InkPresenter控件一样.实时执行此操作的最佳方法是什么?使用WriteableBitmap.Pixels,我能够访问每个像素,但是当我尝试在MouseMove事件期间编辑它们时,它似乎非常慢,并且一次只更改一个像素.是否有任何库或方法可以帮助简化此过程?谢谢

c# silverlight drawing writeablebitmap stroke

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

我可以使用Silverlight的WriteableBitmap将我的UI的不可见部分保存到位图吗?

假设我有一些网格需要向下滚动以查看其所有行,并且我有兴趣保存一些当前不可见的行作为位图.它是否可行,或者我是否必须实际向下滚动,"拍摄快照",然后再向上滚动?

这是一个可行性问题,因此我没有共享代码.

silverlight writeablebitmap silverlight-4.0

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

如何从BitmapImage创建WriteableBitmap?

我可以从Assets中的图片创建WriteableBitmap.

Uri imageUri1 = new Uri("ms-appx:///Assets/sample1.jpg");
WriteableBitmap writeableBmp = await new WriteableBitmap(1, 1).FromContent(imageUri1);
Run Code Online (Sandbox Code Playgroud)

但是,我无法从图片目录创建WriteableBitmap,(我正在使用 WinRT XAML工具包)

//open image
StorageFolder picturesFolder = KnownFolders.PicturesLibrary;
StorageFile file = await picturesFolder.GetFileAsync("sample2.jpg");
var stream = await file.OpenReadAsync();

//create bitmap
BitmapImage bitmap2 = new BitmapImage();
bitmap2.SetSource();
bitmap2.SetSource(stream);

//create WriteableBitmap, but cannot
WriteableBitmap writeableBmp3 = 
    await WriteableBitmapFromBitmapImageExtension.FromBitmapImage(bitmap2);
Run Code Online (Sandbox Code Playgroud)

它是否正确 ?

writeablebitmap c#-4.0 windows-8 windows-runtime

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

WriteableBitmap(Ex)与DrawingContext的性能

我正在WPF中构建一个自定义UI框架,在这里我基本上放弃了尽可能多的内置布局系统和控件。到目前为止,我一直没有UIElement直接涉足,但是由于我已经在进行测量,整理和渲染自己,所以我认为我可以通过甚至“更接近金属”来减少WPF的更多遗产(尤其是当它来的时候)进行布局/渲染)。在保持托管代码的同时又不害怕自己做肮脏的工作的情况下,有多接近?

我现在正在一边玩一个原型概念,在这个概念中,我只有一个元素继承自UIElement:一个Root类似于剥离的对象Canvas,它“托管”了我的其余布局引擎,并将相关的IInputElement利益引入其中。从那时起,所有元素将完全是自定义对象,而不是从WPF中的任何内容继承而来,而是直接呈现到DrawingContextRoot中(在其OnRender方法中)。

现在,我想知道拥有WriteableBitmap根元素并手动使用它的相对性能,例如,为了方便起见,使用WriteableBitmapEx。没有抗锯齿不是问题,定制命中测试系统也不是问题。

我的想法主要是WriteableBitmap(Ex)不具有任何GPU加速增益的特权,因此,当需要重绘/变换大面积区域时,WriteableBitmap(Ex)的速度将大大降低。

但是,对于“基于像素的渲染引擎”,我确实还有其他需求,因此我仍然对此感兴趣。

有什么见解吗?

编辑:在这种情况下,SharpDX呢?也许曾经的我在这我还不如去与一个DirectX包装像SharpDX一个WinForms的解决方案(..或..我想我真正应该做的是注册了整个C ++安吉拉卷,但不幸的是我没有有时间开始学习这些东西。..

c# wpf writeablebitmap writeablebitmapex drawingcontext

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

RenderTargetBitmap总是消除锯齿我的DrawingVisual

我必须将TextBox中的文本呈现为WriteableBitmap.此代码运行良好,但其中的文本模糊或消除锯齿.关于如何保持别名和清晰的任何想法?

text = new FormattedText(tb.Text,
            new CultureInfo("de-de"),
            FlowDirection.LeftToRight,
            new Typeface(tb.FontFamily, FontStyles.Normal, tb.FontWeight, new FontStretch()),
            tb.FontSize,
            tb.Foreground);


            drawingContext = dv.RenderOpen();
            drawingContext.DrawText(text, Pos);
            drawingContext.Close();


            rtb.Render(dv);
            rtb.CopyPixels(new Int32Rect(0, 0, rtb.PixelWidth, rtb.PixelHeight), wb.BackBuffer, wb.BackBufferStride * wb.PixelHeight, wb.BackBufferStride);
Run Code Online (Sandbox Code Playgroud)

我发现的不起作用:

TextOptions.SetTextFormattingMode(dv, TextFormattingMode.Display);
TextOptions.SetTextRenderingMode(dv, TextRenderingMode.Aliased);
Run Code Online (Sandbox Code Playgroud)

要么

RenderOptions.SetBitmapScalingMode(dv, BitmapScalingMode.NearestNeighbor);
RenderOptions.SetEdgeMode(dv, EdgeMode.Aliased);
Run Code Online (Sandbox Code Playgroud)

writeablebitmap formatted-text rendertargetbitmap drawingvisual

6
推荐指数
0
解决办法
502
查看次数