powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
6 сообщений из 6, страница 1 из 1
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252061
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже спрашивал насчёт картинок для DPI-аварных приложений, но в той теме разговор ушёл в другую тему, в сторону обсуждения вектора, и решил её не поднимать, пусть про вектор будет отдельно.
В общем, для разработки я принял решение - картинки будут в приложении растровые, для каждого разрешения по одной картинке.
Microsoft пока поддерживает 9 скейлов: 100, 125, 150, 175, 200, 225, 250, 300 и 350 процентов, от 96 до 336DPI.
Соответственно, имея 100%-ную картинку 24х24, я имею для каждой 9 копий, вплоть до 84х84 пикселя.
Вопрос, как этим всем управлять.

Сейчас, на время макета, все картинки просто сложил всё в каталог Images, переименовал по схеме Copy-100.png, Copy-125.png ... Copy-350.png. Сделал DpiHelper - вычисляет текущий DPI, и сделал перечислитель в ViewModel:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	class PMAViewModel
	{
		private DpiHelper dpiHelper = new DpiHelper();

		public string this[string sPictureName]
		{
			get
			{
				return @"Images/" + sPictureName + "-" + dpiHelper.ScaleX.ToString() + ".png";
			}
		}
	}



В XAML использую такую схему:

Код: xml
1.
<Image Source="{Binding [Copy]}" />



А что делать, когда картинок будет тысячи? А их будут тысячи: у меня сейчас только на тулбарах почти 2 сотни картинок, умножить на 9 - почти 2К. А ещё контролы-шмантролы и т.п. А ещё надо иметь кастомные версии продукта, в которых другие лого, картинки на некоторых кнопках, картинки с текстами и т.д.

Кто как управляется с подобным хозяйством? Если вынести всё в ресурсную dll-ку, сколько занимает времени перерисовка при перетаскивании на экран с другим DPI? Какай fps на retina-дисплеях?
...
Рейтинг: 0 / 0
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252181
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может сделать свой ImageSource, но тут есть жопа, ImageSource нелья имплиментировать, по причине того, что там Internal классы повсюду, но есть еще вариант BitmapSource и прочие не Sealed классы наследованные от ImageSource.
Можно попробовать через ObjectDataProvider:
типа такого:
Код: c#
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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    public class UriWrapper : Freezable
    {
        public Uri Source { set; get; }

        protected override Freezable CreateInstanceCore()
        {
            return new UriWrapper();
        }
    }

    public class UriCollection : ObservableCollection<UriWrapper> {}

    public class Test
    {
        private readonly UriCollection _imageCollection;

        public Test(UriCollection imagecollection)
        {
            _imageCollection = imagecollection;
        }

        public BitmapImage GetImage()
        {
            return _imageCollection.Count > 0 ? new BitmapImage(_imageCollection[DpiImageSource.Index].Source) : null;
        }
    }

    [ContentProperty(nameof(Images))]
    public class DpiImageSource : ObjectDataProvider
    {
        public static int Index = 1;
        public UriCollection Images { get; } = new UriCollection();

        public DpiImageSource()
        {
            ObjectInstance = new Test(Images);
            MethodName = "GetImage";
        }

    }



Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<Window>
    <Window.Resources>
        <local:DpiImageSource x:Key="DpiImageSource">
            <local:UriWrapper Source="1.jpg"/>
            <local:UriWrapper Source="2.png"/>
            <local:UriWrapper Source="3.jpg"/>
        </local:DpiImageSource>

    </Window.Resources>
    <Grid>
        <Border BorderThickness="1" BorderBrush="Gray" Margin="10" Padding="10"
                Background="LightGray">
            <Image  Source="{Binding Source={StaticResource DpiImageSource}}"/>
        </Border>
    </Grid>
</Window>


p.s. это только идейный код, ни чего не вычисляется, но картинка показывается в зависимости от статического свойства Index, как получить Index картинки с соответствующим DPI думай сам :)
...
Рейтинг: 0 / 0
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252665
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtes, т.е. мне для каждой картинки надо будет объявлять в ресурсе массив local:DpiImageSource и туда набрасывать картинки? Блин, довольно громоздко. Там же не 1, 2, 3.jpg, а 1-2-3-4-5-6-7-8-9.
...
Рейтинг: 0 / 0
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252673
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13thRoman Mejtes, т.е. мне для каждой картинки надо будет объявлять в ресурсе массив local:DpiImageSource и туда набрасывать картинки? Блин, довольно громоздко. Там же не 1, 2, 3.jpg, а 1-2-3-4-5-6-7-8-9.
любые ресурсы выглядят громоздко, но если их правильно распределить то норм, тем более, что в XAML форме всё не плохо читается, но если хотите, делайте чисто в коде, подобное, не кто не запрещает
...
Рейтинг: 0 / 0
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252724
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
(Вопрос от новичка) А в чём принципиальное отличие от моего метода? У меня есть код, который на основании окружения подставляет имя файла. У Вас сразу возвращает BitmapImage. Что одно, что другое по сути не решает проблемы.
Может, лучше написать свой класс DpiAwaredImage, который буду инициализировать списком картинок? Но не так, как в риббонах, там тоже довольно громоздко:

Код: xml
1.
2.
3.
4.
5.
6.
<Command.LargeImages>
  <Image Source="res/CutLargeImage32.bmp" Id="116" Symbol="ID_CUT_LARGEIMAGE1" MinDPI="96" />
  <Image Source="res/CutLargeImage40.bmp" Id="117" Symbol="ID_CUT_LARGEIMAGE2" MinDPI="120" />
  <Image Source="res/CutLargeImage48.bmp" Id="118" Symbol="ID_CUT_LARGEIMAGE3" MinDPI="144" />
  <Image Source="res/CutLargeImage64.bmp" Id="119" Symbol="ID_CUT_LARGEIMAGE4" MinDPI="192" />
</Command.LargeImages>



Я бы хотел иметь чтнб типа:

Код: xml
1.
<DpiAwaredImage Sources="res/CutLargeImage32.bmp;res/CutLargeImage40.bmp;res/CutLargeImage48.bmp;" />
...
Рейтинг: 0 / 0
DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
    #39252728
13th
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesлюбые ресурсы выглядят громоздко, но если их правильно распределить то норм, тем более
Тут не спорю. Тем более, это подходит для моих целей - кастомизировать приложение.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / DPI Aware картинки - ЧАСТЬ 2, Обсудим управление растровыми картинками?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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