Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WPF: Экспорт Canvas'a в BMP, Черный или прозрачный файл на выходе 
:(
    Опции темы
izz
Дата 2.5.2011, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Здравствуйте!
Есть Canvas (WPF), заполняемый в процессе работы программы (в том числе изменяется и размер). Стоит задача экспортировать его в файл BMP/PNG.
Гугл помог найти несколько вариантов решения, но все они приводят к получению черного BMP файла или прозрачного PNG файла (замечу, что фон Canvas'a задан белым).

Например, код:

Код


        public static void SaveCanvasToFile(Canvas surface, string filename)
        {
            // Save current canvas transform
            //Transform transform = surface.LayoutTransform;
            // reset current transform (in case it is scaled or rotated)
            surface.LayoutTransform = null;

            // Get the size of canvas
            Size size = new Size(surface.Width, surface.Height);
            // Measure and arrange the surface
            // VERY IMPORTANT
            surface.Measure(size);
            surface.Arrange(new Rect(size));
            surface.UpdateLayout();
            // Create a render bitmap and push the surface to it
            RenderTargetBitmap renderBitmap =
              new RenderTargetBitmap(
                (int)size.Width,
                (int)size.Height,
                96d,
                96d,
                PixelFormats.Pbgra32);
            renderBitmap.Render(surface);

            // Create a file stream for saving image
            using (FileStream outStream = new FileStream(filename, FileMode.Create))
            {
                // Use png encoder for our data
                BmpBitmapEncoder encoder = new BmpBitmapEncoder();
                // push the rendered bitmap to it
                encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
                // save the data to the stream
                encoder.Save(outStream);
            }
}



Что я делаю не так и что можно предпринять?

PM MAIL   Вверх
izz
Дата 2.5.2011, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Интересно, что этот код, оказывается, нормально ест другую канву. Но чем она принципиально отличается от нужной, мне не понятно.
Та, которую алгоритм ест имеет Auto размеры, а нужная фиксированные, но изменяемые кодом вручную.

Вообще опишу задачу, чтобы предотвратить ненужные костыли.
Программа рисует WPF'ом различные графики на нескольких закладках TabControl'a. Задача - всех их экспортировать. Размеры Canvas'ов на закладках - Auto, поэтому, пока закладка не будет хоть раз открыта, на соответствующей ей канве ничего рисовать нельзя (неизвестны размеры, а даже если известны рендера все равно не будет, как я понимаю, пока не откроешь вкладку. Отлавливаю момент первого ресайза чтобы нарисовать изображение).
Ну вот я подумал что бы экспортировать сделаю канву на текущей закладке и проведу цикл "отрисовка-экмпорт" для всех графиков smile.
У меня есть ощущение, что куда-то закрались сильные костыли. Как лучше поступить?)

Спасибо!

PM MAIL   Вверх
izz
Дата 2.5.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



А во, заметил, что если целевую канву подвинуть в верхний левый угол, то вроде работает. Делается снимок как бы левого верхнего куска окна с размерами канвы. Из-за чего это может быть?
PM MAIL   Вверх
ICEMAN3141592
Дата 17.5.2011, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 29.12.2009

Репутация: нет
Всего: нет



Привет, нашел в чем косяк ? Сам скоро подобным буду заниматься
PM MAIL   Вверх
izz
Дата 17.5.2011, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.5.2011

Репутация: нет
Всего: нет



Пока нет, сделал костылём - разместив канву в верхнем левом углу. Если узнаешь в чем тут дело, напиши пожалуйста smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.