我正在WPF中构建一个自定义UI框架,在这里我基本上放弃了尽可能多的内置布局系统和控件。到目前为止,我一直没有UIElement直接涉足,但是由于我已经在进行测量,整理和渲染自己,所以我认为我可以通过甚至“更接近金属”来减少WPF的更多遗产(尤其是当它来的时候)进行布局/渲染)。在保持托管代码的同时又不害怕自己做肮脏的工作的情况下,有多接近?
我现在正在一边玩一个原型概念,在这个概念中,我只有一个元素继承自UIElement:一个Root类似于剥离的对象Canvas,它“托管”了我的其余布局引擎,并将相关的IInputElement利益引入其中。从那时起,所有元素将完全是自定义对象,而不是从WPF中的任何内容继承而来,而是直接呈现到DrawingContextRoot中(在其OnRender方法中)。
现在,我想知道拥有WriteableBitmap根元素并手动使用它的相对性能,例如,为了方便起见,使用WriteableBitmapEx。没有抗锯齿不是问题,定制命中测试系统也不是问题。
我的想法主要是WriteableBitmap(Ex)不具有任何GPU加速增益的特权,因此,当需要重绘/变换大面积区域时,WriteableBitmap(Ex)的速度将大大降低。
但是,对于“基于像素的渲染引擎”,我确实还有其他需求,因此我仍然对此感兴趣。
有什么见解吗?
编辑:在这种情况下,SharpDX呢?也许曾经的我在这我还不如去与一个DirectX包装像SharpDX一个WinForms的解决方案(..或..我想我真正应该做的是注册了整个C ++安吉拉卷,但不幸的是我没有有时间开始学习这些东西。..
我想做这样的事情http://weblogs.asp.net/broux/archive/2011/02/08/silverlight-how-to-watermark-a-writeablebitmapimage-with-a-text.aspx。我很难在WinRT中使用它。我正在使用WriteableBitmap扩展来“渲染”一些文本,但我希望它看起来像本示例中的样子。有什么建议或帮助吗?
**
找到解决方案
由于这是一个瓷砖,因此图像总是会被173扩展到173!
为了避免这种情况,首先用173创建一个虚拟173,并将其与调整大小的一个合并!
Rect rect = new Rect(0.0, 0.0, width, height);
WriteableBitmap bitmapDummy = new WriteableBitmap(173, 173);
bitmapDummy.Blit(rect, resized, rect, WriteableBitmapExtensions.BlendMode.None);
Run Code Online (Sandbox Code Playgroud)
**
我已经创建了一个后台代理来更新我的WP7应用程序的实时磁贴.但无论我试图调整大小,我都没有取得好成绩!
有小费吗?目前我有以下代码,但我也试过135乘173和其他插值.
WriteableBitmap writeableBitmap = new WriteableBitmap(bitmapImage);
var resized = writeableBitmap.Resize(173, 173, System.Windows.Media.Imaging.WriteableBitmapExtensions.Interpolation.Bilinear);
Run Code Online (Sandbox Code Playgroud)
下面还添加了一个小矩形来显示应用程序的标题!它的高度为40像素,如果将图像裁剪在上面会很棒.实际图像总是250 x 321px


我在WinRT项目中使用WriteableBitmapEx.我将图像加载到用户图片库的WriteableBitmap中.但是,我不能立即写入该图像,如果我这样做,它将被图像本身覆盖(看起来它是异步加载图像然后它覆盖我的绘图在它上面).我不知道如何阻止它(我尝试在SetSource上使用Await,但这不是Async方法).
我已经使用了"Await Task.Delay(1000)"并且有效,但它看起来很hacky因为1000ms可能或者可能没有足够的时间..我希望它等到位图加载后再继续.
任何人都可以看出我做错了什么或建议我如何确保在进行任何处理之前从图片库加载WriteableBitmap?这是我创建的示例代码段:
Dim file = Await picker.PickSingleFileAsync
If file Is Nothing Then
Exit Sub
End If
Dim wbm As New WriteableBitmap(1, 1)
wbm.SetSource(Await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
' If I don't have this, the DrawLine will not show up, if I do, it will.
Await Task.Delay(1000)
wbm.DrawLine(1, 1, 255, 255, Colors.Green)
wbm.Invalidate()
ImageMain.Source = wbm
Run Code Online (Sandbox Code Playgroud) filepicker writeablebitmap async-await writeablebitmapex windows-runtime
正如我看到WriteableBitmapEx的codeplex网站: -
http://writeablebitmapex.codeplex.com/
我可以看到翻转,旋转等方法.但是当我下载程序集时,添加引用并检查这些方法它们不可用.谁能告诉我我错过了什么?
提前致谢 :)
我正在使用WriteableBitmapEx库编辑使用Windows 8 Pro平板电脑的凸轮拍摄的图像。每次调用GetPixel()函数时,都会得到一个AccessViolationException,这是代码:
Windows.Media.Capture.MediaCapture captureMgr = new MediaCapture();
await captureMgr.InitializeAsync();
IRandomAccessStream memoryStream = new InMemoryRandomAccessStream();
await captureMgr.CapturePhotoToStreamAsync(imageProperties, memoryStream);
await memoryStream.FlushAsync();
memoryStream.Seek(0);
WriteableBitmap tmpImage = new WriteableBitmap(1, 1);
tmpImage.SetSource(memoryStream);
tmpImage.GetPixel(1, 1); // An AccessViolationException occurs.
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
我当前的代码是将一个小的 Pbgra32 位图 blit'ing 到一个更大的 Pbgra32 位图上。工作正常。我现在想做的就是让那个较小的部分透明。为此,在 blit 之前,我将较小的值传递给一种方法,该方法应通过保留 RGB 值来编辑每个像素,同时将 0x7F 写入每个像素的 A 值。
然而,我得到的不是 50% 透明的图像,而是一个灰色的方块。我究竟做错了什么?
private void MakeTransparent(ref WriteableBitmap bmp)
{
int width = bmp.PixelWidth;
int height = bmp.PixelHeight;
int stride = bmp.BackBufferStride;
int bytesPerPixel = (bmp.Format.BitsPerPixel + 7)/8;
unsafe
{
bmp.Lock();
byte* pImgData = (byte*) bmp.BackBuffer;
int cRowStart = 0;
int cColStart = 0;
for (int row = 0; row < height; row++)
{
cColStart = cRowStart;
for (int col = 0; col < width; col++) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用WriteableBitmapEx从我的硬盘驱动器上的Image创建一个WriteableBitmap.我在添加nuget包后复制了官方页面中的代码:
WriteableBitmap writeableBmp = new WriteableBitmap(0, 0).FromResource("Data/flower2.png");
Run Code Online (Sandbox Code Playgroud)
但我得到了错误
'System.Windows.Media.Imaging.WriteableBitmap'不包含带有2个参数的构造函数
我添加了PresentationCore.dll,因为我在控制台应用程序中被告知WriteableBitmapEx? 以及System.Windows.Media.Imaging的using语句.