2013-08-14 2 views
-2

У меня есть небольшая проблема .. Я разрабатываю SkinEngine, который позволяет использовать приложение Delphi Vcl. для этой цели я разработал новый формат файла (mSkin), чтобы разместить данные моего скина. Так что мой файл скина содержит 2 заголовка, первый содержит некоторую информацию о цветах, используемых скином, второй содержит растровое изображение, используемое (тип растрового изображения - это растровое изображение альфа-канала, чтобы поддерживать прозрачность). В моем управлении я использую функцию для извлечения растрового изображения объекта из растрового изображения (mSkin.Bitmap) и нарисовать это растровое изображение на моем элементе управления. проблема в том, что, когда растровое изображение не сформировано, я получил плохое качество при масштабировании исходного растрового изображения. Размер растрового изображения объекта пропорционален размеру управления (при изменении размера контура ==> изменение растрового изображения тоже.) enter image description hereмасштабирование растрового изображения без потери качества

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

+2

Почему вы не используете ** стили VCL? –

+0

@Uli Gerhardt: это для образовательной цели. –

ответ

4

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

+1

Я бы предложил, например. ['SVG format'] (http://en.wikipedia.org/wiki/Scalable_Vector_Graphics). Для Delphi существует несколько ['libraries available'] (http://stackoverflow.com/questions/63607/rendering-svg-with-delphi). – TLama

+0

Я считаю, что мы можем использовать битмап-файл, так как стиль vcl использовал формат растрового файла. –

+0

@ user1720557 Вы можете устранить некоторые проблемы с масштабированием растровых изображений, имея несколько предварительно масштабированных растровых изображений, и тогда вам не нужно так сильно масштабироваться. –

3

Вам необходимо разделить это на 9 различных растровых изображений, например, сетку 3x3. то вы только масштабируете середину, остальные остаются одинакового размера, но перемещаются. This link предназначен для android, но применяются те же принципы.

Адрес another link. Это для вспышки, но это также объясняет принцип.

+0

полезная техника, но не работает хорошо в моем опыте с градиентами – mark

+0

@mark Справедливая точка, но когда я использовал их, как этот градиент необходимо растянуть достаточно далеко, чтобы проявить себя как проблему. – finlaybob

+0

Возможно, GDI + (http://sourceforge.net/projects/igdiplus/) моя помощь по передискретизации изображения для градиентов – AlexSC

3

Попробуйте использовать resampling algorithm.

Для масштабирования, мне очень нравится B-Spline.

Для простого контента, такого как ваш, hqnx family иногда дает хорошие результаты и очень быстр для рендеринга (даже в режиме реального времени). Для некоторых исходных кодов pascal, you may take a look at this forum thread.

См. Также this more general question.