我正在尝试编写一些能够方便地处理视频帧的代码.我收到框架作为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) 我正在渲染RenderTargetBitmap的几十个视觉效果.每个都在它自己的Rect中呈现.我想要做的是将RenderTargetBitmap实例渲染的这些Rect区域之一复制到WriteableBitmap的同一区域...快速复制rect像素或smth.像那样.
那么,有没有办法以快速的方式将Rect从RenderTargetBitmap复制到WriteableBitmap?
如何在WPF中将WriteableBitmap对象转换为对象BitmapImage?
这个链接涵盖了silverlight,WPF中的进程不一样,WriteableBitmap对象没有SaveJpeg方法.
所以我的问题是如何在WPF中将WriteableBitmap对象转换为对象BitmapImage?
我有一个Windows Phone 8应用程序,它使用后台代理:
但是,当它在后台运行时,它会得到OutOfMemoryException一些故障排除:
OutOfMemoryException在期间抛出var bmp = new WriteableBitmap(480, 800);我试过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 …
我正在试图找出如何释放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) 我有一个WriteableBitmap,并希望用户能够绘制它,就像它是InkPresenter控件一样.实时执行此操作的最佳方法是什么?使用WriteableBitmap.Pixels,我能够访问每个像素,但是当我尝试在MouseMove事件期间编辑它们时,它似乎非常慢,并且一次只更改一个像素.是否有任何库或方法可以帮助简化此过程?谢谢
假设我有一些网格需要向下滚动以查看其所有行,并且我有兴趣保存一些当前不可见的行作为位图.它是否可行,或者我是否必须实际向下滚动,"拍摄快照",然后再向上滚动?
这是一个可行性问题,因此我没有共享代码.
我可以从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)
它是否正确 ?
我正在WPF中构建一个自定义UI框架,在这里我基本上放弃了尽可能多的内置布局系统和控件。到目前为止,我一直没有UIElement直接涉足,但是由于我已经在进行测量,整理和渲染自己,所以我认为我可以通过甚至“更接近金属”来减少WPF的更多遗产(尤其是当它来的时候)进行布局/渲染)。在保持托管代码的同时又不害怕自己做肮脏的工作的情况下,有多接近?
我现在正在一边玩一个原型概念,在这个概念中,我只有一个元素继承自UIElement:一个Root类似于剥离的对象Canvas,它“托管”了我的其余布局引擎,并将相关的IInputElement利益引入其中。从那时起,所有元素将完全是自定义对象,而不是从WPF中的任何内容继承而来,而是直接呈现到DrawingContextRoot中(在其OnRender方法中)。
现在,我想知道拥有WriteableBitmap根元素并手动使用它的相对性能,例如,为了方便起见,使用WriteableBitmapEx。没有抗锯齿不是问题,定制命中测试系统也不是问题。
我的想法主要是WriteableBitmap(Ex)不具有任何GPU加速增益的特权,因此,当需要重绘/变换大面积区域时,WriteableBitmap(Ex)的速度将大大降低。
但是,对于“基于像素的渲染引擎”,我确实还有其他需求,因此我仍然对此感兴趣。
有什么见解吗?
编辑:在这种情况下,SharpDX呢?也许曾经的我在这我还不如去与一个DirectX包装像SharpDX一个WinForms的解决方案(..或..我想我真正应该做的是注册了整个C ++安吉拉卷,但不幸的是我没有有时间开始学习这些东西。..
我必须将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
writeablebitmap ×10
c# ×4
wpf ×4
silverlight ×2
bitmapimage ×1
c#-4.0 ×1
drawing ×1
memory-leaks ×1
stroke ×1
unsafe ×1
windows-8 ×1