在生产 WCF 服务中使用 RenderTargetBitmap 在内存中创建位图失败
Creating bitmap in memory using RenderTargetBitmap fails in production WCF Service
我正在使用 WPF 对象在内存中生成位图图像。执行此操作的程序驻留在 WCF Web 服务中。当我 运行 在本地 IISExpress 和测试 IIS 7 服务器上时,图像正确呈现。但是,当 运行ning 在 QA 使用的服务器上时,图像无法正确呈现。更具体地说,仅渲染 250 像素高度图像的顶部 22 像素线。测试服务器和 QA 服务器上的设置应该是相同的(在这里插入怀疑的脸)。
问题:IIS 中的哪些可能设置会影响此图像渲染?另外,我认为可能存在线程问题,因为 RenderTargetBitmap 是异步呈现的,而且我确实得到了部分图像。
这是我使用的代码:
private byte[] RenderGauge(ViewData viewData)
{
double resolution = 4 * ReSize;
double dpi = 96 * resolution;
var view = new Gauge();
var vm = new GuageViewModel(viewData);
view.Measure(new Size(350, 70));
view.Arrange(new Rect(new Size(350, 70)));
var bounds = VisualTreeHelper.GetDescendantBounds(view);
if (bounds != Rect.Empty)
{
height = (int)(Math.Floor(bounds.Height) + 1);
width = (int)(Math.Floor(bounds.Width) + 1);
size = new Size(width, height);
}
var bitmap = new RenderTargetBitmap((int)(width * resolution), (int)(height * resolution), dpi, dpi, PixelFormats.Pbgra32);
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
var brush = new VisualBrush(view);
context.DrawRectangle(brush, null, new Rect(new Point(), bounds.Size));
}
bitmap.Render(visual);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
byte[] img;
using (var MS = new MemoryStream())
{
encoder.Save(MS);
img = MS.ToArray();
}
img = img == null ? new byte[0] : img;
return img;
}
所以,我正在做完全相同的事情,但我在渲染文件时遇到了很多问题。我发现在 XAML 中使用位图绑定会有所帮助。来自我的视图模型的代码 returns 图像源是:
public Uri ImageUri
{
get { return new Uri(ImagePath, UriKind.Absolute); }
}
public BitmapImage ImageSource
{
get
{
try
{
if (string.IsNullOrEmpty(ImagePath) || !File.Exists(ImagePath))
return null;
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = ImageUri;
image.EndInit();
return image;
}
catch (Exception e)
{
var logger = LogManager.GetLogger(typeof(ImageDetails));
ExceptionHelper.LogExceptionMessage(logger, e);
}
return null;
}
}
然后在 XAML 中绑定到 ImageSource 属性。
我认为 RenderTargetBitmap 的大多数问题都与 XAML 中的异步绑定有关,因为渲染方法是同步的。
我正在使用 WPF 对象在内存中生成位图图像。执行此操作的程序驻留在 WCF Web 服务中。当我 运行 在本地 IISExpress 和测试 IIS 7 服务器上时,图像正确呈现。但是,当 运行ning 在 QA 使用的服务器上时,图像无法正确呈现。更具体地说,仅渲染 250 像素高度图像的顶部 22 像素线。测试服务器和 QA 服务器上的设置应该是相同的(在这里插入怀疑的脸)。
问题:IIS 中的哪些可能设置会影响此图像渲染?另外,我认为可能存在线程问题,因为 RenderTargetBitmap 是异步呈现的,而且我确实得到了部分图像。
这是我使用的代码:
private byte[] RenderGauge(ViewData viewData)
{
double resolution = 4 * ReSize;
double dpi = 96 * resolution;
var view = new Gauge();
var vm = new GuageViewModel(viewData);
view.Measure(new Size(350, 70));
view.Arrange(new Rect(new Size(350, 70)));
var bounds = VisualTreeHelper.GetDescendantBounds(view);
if (bounds != Rect.Empty)
{
height = (int)(Math.Floor(bounds.Height) + 1);
width = (int)(Math.Floor(bounds.Width) + 1);
size = new Size(width, height);
}
var bitmap = new RenderTargetBitmap((int)(width * resolution), (int)(height * resolution), dpi, dpi, PixelFormats.Pbgra32);
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
var brush = new VisualBrush(view);
context.DrawRectangle(brush, null, new Rect(new Point(), bounds.Size));
}
bitmap.Render(visual);
var encoder = new PngBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bitmap));
byte[] img;
using (var MS = new MemoryStream())
{
encoder.Save(MS);
img = MS.ToArray();
}
img = img == null ? new byte[0] : img;
return img;
}
所以,我正在做完全相同的事情,但我在渲染文件时遇到了很多问题。我发现在 XAML 中使用位图绑定会有所帮助。来自我的视图模型的代码 returns 图像源是:
public Uri ImageUri
{
get { return new Uri(ImagePath, UriKind.Absolute); }
}
public BitmapImage ImageSource
{
get
{
try
{
if (string.IsNullOrEmpty(ImagePath) || !File.Exists(ImagePath))
return null;
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = ImageUri;
image.EndInit();
return image;
}
catch (Exception e)
{
var logger = LogManager.GetLogger(typeof(ImageDetails));
ExceptionHelper.LogExceptionMessage(logger, e);
}
return null;
}
}
然后在 XAML 中绑定到 ImageSource 属性。
我认为 RenderTargetBitmap 的大多数问题都与 XAML 中的异步绑定有关,因为渲染方法是同步的。