InkCanvas в растровое изображение

У меня проблема с сохранением холста в файл BMP (или любой другой тип).

Я пытаюсь сохранить свой InkCanvas следующим образом:

int margin = (int)canvas.Margin.Left;
int width = (int)canvas.ActualWidth -margin;
int height = (int)canvas.ActualHeight -margin;
//render ink to bitmap
RenderTargetBitmap renderBitmap =
new RenderTargetBitmap(width, height, 96d, 96d, PixelFormats.Default);
renderBitmap.Render(canvas);
//save the ink to a memory stream
BitmapEncoder encoder;
encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
encoder.Save(myStream);

Но я всегда получал изображение с черными границами слева и сверху, одинакового размера от точки (0,0) моего окна до моего холста. Что я делаю неправильно? введите здесь описание изображениявведите здесь описание изображения


person Vitaly Senko    schedule 16.12.2013    source источник


Ответы (3)


Вам нужно поместить его в отдельный контейнер (т.е. в Grid).

person Eugene    schedule 07.02.2014

У меня была аналогичная проблема, и похоже, что ваши поля влияют на рендеринг изображения.

Я предполагаю, что холст - это имя InkCanvas, поэтому, чтобы избежать черных рамок, все, что вам нужно сделать, это изменить свои кадры WPF и использовать холст для настройки полей вместо использования InkCanvas:

<Grid Height="340" Width="445">
   <Canvas Background="Transparent" Margin="10,10,0,0">
      <InkCanvas Name="canvas" Height="320" Width="425"/>
   </Canvas>
</Grid>
person MuffenMan    schedule 16.06.2017

Из того, что я прочитал, растровые изображения не могут обрабатывать прозрачный фон. Поэтому, когда создается растровое изображение, пиксели остаются черными. Просто измените свой чернильный холст на белый фон (или любой другой цвет, который вы хотите). Проверьте это: WPF - черный фон вокруг сохраненного холста в формате jpeg также вы можете попытаться избавиться от минусовых полей и просто использовать весь чернильный холст при создании изображения.

RenderTargetBitmap rtb = new RenderTargetBitmap((int)inkCanvas.ActualWidth, (int)inkCanvas.ActualHeight, 96, 96, System.Windows.Media.PixelFormats.Default);
person bbedson    schedule 16.09.2020