Конференция ".Net" » Заливка области изображением. [C#]
 
  • KilkennyCat © (12.02.16 22:17) [0]
    Есть рамка, красивая, у которой может изменятся ширина и высота.
    Рамка построена из 8-и изображений: все углы, верхняя, нижняя, левая и правая планки.
    нашел три варианта, как закрашивать планки (углы не масштабируются при изменении размеров рамки):
    1) самый простой. сохраняем заведомо большие по размеру картинки планок, при отрисовке ненужное отсечется. Недостаток - храним много лишнего.
    2) создаем текстурную кисть из изображения шириной (высотой) в 1 пиксел, заливаем область. Недостаток: начала координат областей планок должны быть кратны высоте (ширине) кисти, иначе происходит сдвиг картинки внутри кисти (надеюсь, понятно высказался).
    3) те же картинки из 2) отрисовываем через DrawImage(image, x, y, width, height). Однако, тут тоже недостаток: интерполяция. Установка режима NearestNeighbor работает очень забавно, впечатление, что сначала все равно градиент, как опорный, а потом огрубляется. Результат: заливка примерно до середины области. Избавление:  DrawImage(image, x, y, width * 2, height) (для горизонта).

    Мне сие кажется странным.
    Я чего-то недопонял, или это единственные варианты?

    есть, конечно и четвертый вариант, накидать боксов с фоном, задать им док, будут сами растягиваться и смещаться :)
  • Наиль © (13.02.16 19:12) [1]
    Я, в своё время, обошёлся хранением только углов. Получалось очень красиво. Но я генерировал кнопки, поэтому центральная область тоже заливалась. В качестве основы мог использовать всё, что угодно: фотографии металлических шариков, скриншоты кнопок из "Сокровища Монтесумы" и стандартных контролы винды: кнопки, радио и чекбоксы. У получившейся кнопки ограничение было только на минимальный размер, а максимальный мог быть любым.
    К сожалению, это всё где-то в древних бэкапах.
    Из твоих вариантов я бы выбрал второй, только с промежуточным шагом.
    Т.е. заливал бы кратную область, которая чуть больше, той которая есть, на вспомогательном холсте, а потом копировал бы с масштабированием на положенное место.

    Четвёртый вариант, вообще не вариант. Так как ширина рамок растёт вместе с контролом, и текст начинает влазить на рамку. Да и контролы начинают выглядеть по разному.

    А правильный вариант, это использование векторной графики, так как это делает ворд для декоративных рамок страницы.
  • KilkennyCat © (13.02.16 19:55) [2]

    > Наиль ©   (13.02.16 19:12) [1]

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

    второй вариант с промежуточным шагом - это вариант... пусть будет нумер 2(б).
    Но это тоже с "хитростью".
    неужто BackGroundImageLayout у стандартных контролов тож через какой-то маневр сделан?
  • Наиль © (14.02.16 11:17) [3]
    Ни когда не видел стандартных контролов с периодичной заливкой сторон. Поэтому всегда хватает хранения только углов рамки. А заливка сторон делается с шагом 1 пиксель, поэтому нет необходимости в дополнительном шаге для масштабирования.

    Я ковырял тему Luna комплекта Windows XP программой Restorator. Там всё как на ладони. Но подробностей не помню, давно это было.
  • KilkennyCat © (14.02.16 11:38) [4]

    > не видел стандартных контролов с периодичной заливкой сторон

    сторон - нет. весь заливается.
    и в этом моя тупость :) - сделав из сначала из контрола сторону, потом удивлялся "странному" поведению варианта 2.

    Спасибо, Наиль.
  • имя (21.04.16 15:03) [5]
    Удалено модератором
  • ЯЧтсия (09.01.17 14:49) [6]
    Удалено модератором
 
Конференция ".Net" » Заливка области изображением. [C#]
Есть новые Нет новых   [118670   +55][b:0][p:0]