powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight сохранение скрина страницы
16 сообщений из 16, страница 1 из 1
Silverlight сохранение скрина страницы
    #37144550
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток.

Моя проблема заключается в том, что когда я хочу сохранить рисунок canvas в JPEG.
Я сначала создаю Bitmap, а потом перевожу в JPEG, используя FJ.Core.
В принципе делается это так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
// Создаём bitmap
WriteableBitmap bmp = new WriteableBitmap((int)cnv.ActualWidth, (int)cnv.ActualHeight);
bmp.Render(cnv, cnv.RenderTransform);
bmp.Invalidate();

// Сохранение файла
if (bmp != null)
{
      SaveFileDialog saveDlg = new SaveFileDialog();
      saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
      saveDlg.DefaultExt = ".jpeg";

     // Открытие диалогового окна сохранения
     if ((bool)saveDlg.ShowDialog())
          using (Stream fs = saveDlg.OpenFile())
          {
                // Сохранение с конвертированием в формат JPEG
                SaveToFile(bmp, fs);
          }
}
На канве картинка создаётся с использование различных объектов(line, UserControl, image, rectange). В UserControl есть и image, и надписи, и grid с разметкой, и используется стиль оформления.
Всё вроде как хорошо должно быть и на канве всё отображается, но проблема заключается в том, что при сохранении напрочь теряются все grid с разметкой и стили в UserControl. В результате от контрола остаётся только image сведённые в одну точку.

Подскажите как с этим можно справится.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144667
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dok-Sergey,

Код: plaintext
WriteableBitmap bmp = new WriteableBitmap((int)cnv.ActualWidth, (int)cnv.ActualHeight);
У вас эти переменные равны 0. Повесьте на cnv обработчик события SizeChanged и в этом событии сохраняйте в переменную размер.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144668
Руки-крюки
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторWriteableBitmap bmp = new WriteableBitmap((int)cnv. ActualWidth , (int)cnv. ActualHeight );
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144688
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может попробовать ImageTools for Silverlight library ?
работающий пример (png, но в библиотеке есть сборка ImageTools.IO.Jpeg) - http://www.codeproject.com/KB/silverlight/SilverlightScreenCapture.aspx
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144750
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Руки-крюки,

Я не совсем всё написал, так что значение размеров канвы устанавливаются и значение cnv.ActualWidth и cnv.ActualHeight не равны 0. Это точно.

Дело в том, что пример этот что я написал рабочий. Единственно, что при добавлении именно UserControl в канву возникают с ним проблемы.

LR,
посмотрю, спасибо
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144751
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Вместо первых трех строк

Код: plaintext
1.
WriteableBitmap screenShot = new WriteableBitmap(cnv, null); 
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144757
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
i,

Да можно и так, но проблему это не решает.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144807
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема именно при переводе из канвы в WriteableBitmap.
Именно в этот момент что-то происходит.
Если сделать:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Создаём bitmap
WriteableBitmap bmp = new WriteableBitmap(cnv, null);

Image img = new Image();
img.Source = bmp;

cnv.Children.Add(img); // добавляем в канву
Эти проблемы и видно.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37144917
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Зачем ты его еще в канву добавляешь?
Код: plaintext
1.
2.
3.
4.
WriteableBitmap bmp = new WriteableBitmap(cnv, null);
var image = bmp.ToImage();
...
SaveToFile(image,....);
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145031
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
i,

Код: plaintext
1.
var image = bmp.ToImage();

Функция ToImage() у меня показывает что её нет.
А добавляю я в канву просто чтобы видно было.

И похоже я разобрался в чём дело.
При сохранении в картинку я в той же функции добавляю объекты на канву, что типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// Создаём UserControl
UserControlSample userControl1 = new UserControlSample();
cnv.Children.Add(userControl1);
// Создаём UserControl
UserControlSample userControl2 = new UserControlSample();
cnv.Children.Add(userControl2);
...
и потом сразу

// Создаём bitmap
WriteableBitmap bmp = new WriteableBitmap(cnv, null);
.....

При это похоже не срабатывает внутренний конструктор (что типа внутреннего Loaded), который и должен выстраивать всё по XAML разметке. Ну а потом на экране мы видим нормальную картинку со всеми изменениями.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145131
i
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
i
Гость
Твой контрол не успевает отрисоваться. Сделай сохранение в обработчике OnLoad последнего элемента.
ЗЫ ToImage() - метод расширения
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145265
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
i,

да это делать и буду, спасибо
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145334
Фотография уТКа
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dok-Sergey,

не не, автор, дело в том, что Актуальные размеры контролов не известны до вызова Диспетчера, нужно так:
Код: plaintext
1.
2.
3.
4.
5.
cnv.Dispatcher.BeginInvoke(()=>
{
WriteableBitmap bmp = new WriteableBitmap((int)cnv.ActualWidth, (int)cnv.ActualHeight);
...
});
вот тогда заработает.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145932
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уТКа,

Актуальные размеры известны, можно это увидеть при отладке.
Ну а если использовать код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
// Создаём UserControl
SilverlightControlSample sc = new SilverlightControlSample();
// Устанавливаем положение
sc.Margin = new Thickness(0, 50, 0, 0);
// Добавляем на канву
cnv.Children.Add(sc);
// Создаём bitmap
WriteableBitmap bmp = null;
cnv.Dispatcher.BeginInvoke(() =>
    {
        bmp = new WriteableBitmap((int)cnv.ActualWidth, (int)cnv.ActualHeight);
        bmp.Render(cnv, cnv.RenderTransform);
        bmp.Invalidate();
    });
// Сохранение файла
if (bmp != null)
{
    SaveFileDialog saveDlg = new SaveFileDialog();
    saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
    saveDlg.DefaultExt = ".jpeg";
    // Открытие диалогового окна сохранения
    if ((bool)saveDlg.ShowDialog())
        using (Stream fs = saveDlg.OpenFile())
        {
            // Сохранение с конвертированием                        
            SaveToFile(bmp, fs);
        }
}

То сохранение не происходит, так как bmp = null. Не успевает Диспетчер сработать похоже.
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37145967
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашлось простое решение данной проблемы:
Код: plaintext
1.
cnv.UpdateLayout();
Благодаря этому и происходит загрузка всех контролов и их разметки.
То есть теперь просто пишем так и будет вам счастье, и мне тоже :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
// Создаём UserControl
SilverlightControlSample sc = new SilverlightControlSample();
// Устанавливаем положение
sc.Margin = new Thickness(0, 50, 0, 0);
// Добавляем на канву
cnv.Children.Add(sc);

// Обновляем
cnv.UpdateLayout();

// Создаём bitmap
WriteableBitmap bmp = new WriteableBitmap(cnv, null);
// Сохранение файла
if (bmp != null)
{
    SaveFileDialog saveDlg = new SaveFileDialog();
    saveDlg.Filter = "JPEG Files (*.jpeg)|*.jpeg";
    saveDlg.DefaultExt = ".jpeg";
    // Открытие диалогового окна сохранения
    if ((bool)saveDlg.ShowDialog())
        using (Stream fs = saveDlg.OpenFile())
        {
            // Сохранение с конвертированием                        
            SaveToFile(bmp, fs);
        }
}
...
Рейтинг: 0 / 0
Silverlight сохранение скрина страницы
    #37146151
Dok-Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Некоторые замечания по сохранению:
- не пытайтесь создавать канву и добавлять в неё и сразу сохранять, результат: проблема с разметкой;
- если у канвы стоит Visibility = Collapsed, результат аналогичный.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Silverlight сохранение скрина страницы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]