Wpf изменение размера холста не работает в диспетчере

Я пытаюсь изменить размер холста, используя следующий код, но в диспетчере. Кажется, это не работает, я что-то упускаю?

                    Dispatcher.BeginInvoke(new Action(() => {
                        canvas.RenderTransform = new ScaleTransform(scale, 
scale);
                        canvas.Measure(new Size(scale * w, scale * h));
                        canvas.Arrange(new Rect(0, 0, scale * w, scale * 
h));
                        canvas.UpdateLayout();

                        RenderTargetBitmap rtb = new RenderTargetBitmap(scale * w, scale * h, 96, 96, PixelFormats.Pbgra32);
                        rtb.Render(canvas);
                }), DispatcherPriority.Send);

            }

@Clemens, хорошо, это может быть избыточным - мой вопрос в том, что если это работает нормально, почему бы не работать, когда я помещаю его в фоновый рабочий и использую диспетчер (я делаю это, потому что рендеринг в rendertargetbitmap требует времени, и я не хочу чтобы заморозить мой интерфейс)

sonal pinto 10.09.2018 09:32

Откуда это знать, если вы не показываете соответствующие части своего кода? Как вы пользуетесь Диспетчером?

Clemens 10.09.2018 09:37

@Clemens Я отредактировал свой вопрос, добавил еще код. Обычно я сохраняю свои холсты в очередь и визуализирую их один за другим в главном окне и сохраняю результат в jpeg

sonal pinto 10.09.2018 09:45

Так что именно означает, когда вы говорите «это не работает»? Я до сих пор не знаю, что должен делать ваш код. Все, что я могу сказать, это то, что применение RenderTransform кажется совершенно бессмысленным, если вы хотите изменить размер холста с помощью обычного макета. Вы должны удалить это.

Clemens 10.09.2018 09:58

Я тоже считаю, что установка DispatcherPriority.Send бессмысленна. Удалите это тоже или используйте Нормальный.

Clemens 10.09.2018 10:10

@Clemens Размер не меняется

sonal pinto 10.09.2018 10:17

Но размер RenderTargetBitmap - это то, что вы ожидаете?

Clemens 10.09.2018 10:26

@Clemens Да, исходный размер холста - w и h, затем я умножаю его на масштаб, скажем, 3 или 4, размер холста не изменяется и остается размером w и h, поэтому rendertargetbitmap в основном пуст

sonal pinto 10.09.2018 11:03

А как понять, что размер холста не меняется? Есть ли у него фоновая кисть, или вы ожидаете, что его дочерние элементы будут масштабированы? Расскажите, пожалуйста, больше о фактическом содержании холста. Что вы там рисуете? Может, вы вообще ошиблись.

Clemens 10.09.2018 11:13
0
9
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы создать растровое изображение из холста с масштабированным размером, вам не нужно изменять размер или масштабировать холст.

Просто создайте VisualBrush из Canvas и нарисуйте с его помощью прямоугольник подходящего размера в DrawingVisual. Использование DrawingVisual также позволяет избежать любых потенциальных проблем с полями и выравниванием.

var width = canvas.ActualWidth * scale;
var height = canvas.ActualHeight * scale;
var visual = new DrawingVisual();

using (var dc = visual.RenderOpen())
{
    dc.DrawRectangle(new VisualBrush(canvas), null, new Rect(0, 0, width, height));
}

var rtb = new RenderTargetBitmap((int)width, (int)height, 96, 96, PixelFormats.Default);
rtb.Render(visual);

Проблема с визуальной кистью в том, что она делает изображение на холсте размытым. Есть ли способ обойти это?

sonal pinto 11.09.2018 06:49

Какое изображение? Есть ли на холсте какие-либо элементы изображения?

Clemens 11.09.2018 06:50

Да, на холсте есть изображение.

sonal pinto 11.09.2018 07:01

Попробуйте установить BitmapScalingMode: docs.microsoft.com/en-us/dotnet/api/…

Clemens 11.09.2018 07:11

Я установил Fant, но это не помогает. В результате небольшого исследования выяснилось, что я пытаюсь нарисовать большое изображение маленькой ручкой, поэтому результат получился размытым.

sonal pinto 11.09.2018 07:28

«большое изображение маленькой ручкой» - извините, но это не имеет особого смысла. Однако, поскольку вы не показали что-нибудь об этом изображении на холсте, вам трудно помочь. Может быть, вы напишете еще один вопрос со всеми соответствующими деталями.

Clemens 11.09.2018 07:30

Другие вопросы по теме