Как исправить размытый Icon Decorator на DSL Tools? - PullRequest
1 голос
/ 31 июля 2009

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

Значок декоратора становится «размытым» из-за его позиционирования на фигуре и преобразования пикселей в дюймы.

Обычно поверхность рисования языка, специфичного для предметной области, имеет разрешение 96 точек на дюйм, а декораторы значков располагаются со смещением 0,06 дюймов. Переводя его в пиксели, он становится смещением 5,76 пикселей на поверхности рисования. Поскольку на экране невозможно нарисовать «полупиксель», GDI + корректирует изображение в попытке эмулировать позиционирование «haf-пикселя». Вот почему изображение становится размытым.

В качестве обходного пути я предлагаю использовать свойства «Смещение по горизонтали» и «Смещение по вертикали» класса декоратора «Иконка» для фиксации положения «полупикселя» декоратора. Если вы используете «0,0025» дюйма в качестве вертикального и горизонтального смещения, при позиционировании изображения с дюймов на пиксели оно становится 6 пикселей вместо 5,76. Это происходит потому, что смещение теперь является значением по умолчанию 0,06 дюйма плюс смещение, которое вы установили 0,0025 = 0,0625.

Я также обнаружил, что использование изображений png с прозрачностью приводит к размытию изображения, даже с использованием обходного решения смещения, которое я предложил здесь. Преобразование изображения в растровый формат устраняет проблему.

Если у кого-то также есть какие-либо предложения по устранению проблемы, добавьте свое решение или обходной путь.

1 Ответ

0 голосов
/ 24 августа 2009

Я исправил размытую проблему, создав новое растровое изображение:

По переопределенному методу

public override System.Drawing.Image GetDisplayImage(ShapeElement parentShape)

Я вызываю свой собственный метод FixBitmap

Bitmap imageFixed = DynamicImageHelper.FixBitmap(image, out dynamicOffset);

Этот метод получает исходное изображение, которое будет отображать DSL, но вместо этого возвращает точно такое же изображение, но созданное как новое растровое изображение

Bitmap fixedImage = new Bitmap(original, original.Width, original.Height);
return fixedImage;

Если вы проверите свойства нового экземпляра, между ними будут небольшие различия (я не совсем помню, потому что я реализовал это около 1 года назад). Кроме того, я в основном использую .png файлы с прозрачностью, и они выглядят точно так же, как они.

Надеюсь, это помогло. Если вам нужна дополнительная помощь, не стесняйтесь, С Уважением, Луиш

...