Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   BitmapData.draw() с увеличенным разрешением (http://www.flasher.ru/forum/showthread.php?t=185311)

bookworm 09.10.2012 22:08

BitmapData.draw() с увеличенным разрешением
 
Приветствую. Прошу совета.

Программа рисования. Подложка - прозрачная. Следовательно - ластик должен именно стирать, а не быть кистью с цветом фона.
Пока идея в том, чтобы рисовать (Sprite.Graphics.lineTo и прочие...) в некоторой области, а затем нарисованное сразу же Bitmap.BitmapData.draw(Sprite) под эту область, а из нее - удалять векторное.
Но! Окно масштабируемое. Поэтому при включенном сглаживании, растр мылится. Без - чудовищен.

Как быть?
Я пытаюсь изменить размеры растра, чтобы рисовать с запасом - т.е. выше экранного разрешения. В два, три раза увеличить размеры BitmapData, а перед draw() увеличивать размеры Sprite.
Однако draw() рисует на Bitmap Sprite исходного размера, а не с увеличенными габаритами.

Т.е. суть: как мне в AS3 растеризовать вектор с увеличенным разрешением? Масштабировать растр - не вариант.

КорДум 09.10.2012 22:13

Обратите внимание на параметры BitmapData#draw(). Там матрицу можно указать.

GBee 09.10.2012 22:13

Вроде Matrix для этого

caseyryan 09.10.2012 22:33

Цитата:

Однако draw() рисует на Bitmap Sprite исходного размера, а не с увеличенными габаритами.
Код AS3:

bitmapData.draw(sprite, sprite.transform.matrix); // врисует спрайт таким, какой он есть


bookworm 10.10.2012 00:01

Спасибо за ответы, но матрица преобразования - не то.
Она будет работать с растром и масштабирование будет сделано для растра, с соответствующим ухудшением качества.
Я же хочу провести растеризацию, допустим спрайта размером 100 на 100, в растр 300 на 300 через промежуточный спрайт 300 на 300 (или напрямую). Т.е. масштабирование будет сделано векторно!

Aquahawk 10.10.2012 00:10

Цитата:

Она будет работать с растром и масштабирование будет сделано для растра
А может сначала попробовать?

caseyryan 10.10.2012 08:06

Цитата:

в растр 300 на 300 через промежуточный спрайт 300 на 300 (или напрямую). Т.е. масштабирование будет сделано векторно!
Оо. Это что-то новое. Растр не будет масштабироваться "векторно", даже если его в 10 спрайтов положить
Да и размеры спрайта зависят от размеров содержимого. Пустому спрайту нельзя задать размеры

Frost47rus 10.10.2012 12:48

Цитата:

Сообщение от caseyryan (Сообщение 1099288)
Оо. Это что-то новое. Растр не будет масштабироваться "векторно", даже если его в 10 спрайтов положить
Да и размеры спрайта зависят от размеров содержимого. Пустому спрайту нельзя задать размеры

как я понял, изначально - будет спрайт 100*100.
который просто увеличат в размере и отрисуют уже увеличенным.

bookworm 10.10.2012 16:38

Цитата:

Сообщение от caseyryan (Сообщение 1099288)
Оо. Это что-то новое.

Поглумиться-то - это конечно, а почитать внимательно - нет.

Еще раз выражу свою мысль:
В спрайте есть фигура 100х100.
Я хочу получить в растре 300х300, но масштабирование выполнить векторно.
Например, если я увеличу ширину спрайта до 300х300, это произойдет.
Но в растр запишется 100х100.

Если же, как рекомендуют, я воспользуюсь матрицей преобразования в методе draw(), то я получу РАСТРОВОЕ масштабирование.

Поправьте, возможно я не понял или накосячил в коде?

Код AS3:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Matrix;
 
var matrix : Matrix = new Matrix ();
var sprite:Sprite = new Sprite();
var bitmap:Bitmap = new Bitmap();
var bitmapData:BitmapData = new BitmapData(900, 900);
addChild(sprite);
addChild(bitmap);
matrix.scale (3, 3);
sprite.graphics.lineStyle(2, 0xFF0000);
sprite.graphics.moveTo(50,50);
sprite.graphics.lineTo(110,110);
bitmapData.draw(sprite, matrix);
bitmap.smoothing = true;
bitmap.bitmapData = bitmapData;
bitmap.width = 300;
bitmap.height = 300;
bitmap.x = 130;

Качество bitmap'а заметно хуже. Или просто лучше и не получится?

Добавлено через 4 минуты
Цитата:

Сообщение от Aquahawk (Сообщение 1099257)
А может сначала попробовать?

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

Что-то я не вижу выхода из этой ситуации, который обеспечит и сохранение качества и работу ластика.

Добавлено через 6 минут
Вот оно!
smoothing надо было включать после присваивания bitmapData.

Спасибо всем, кто настаивал на использовании матрицы, особенно Aquahawk.

caseyryan 10.10.2012 17:49

Цитата:

Если же, как рекомендуют, я воспользуюсь матрицей преобразования в методе draw(), то я получу РАСТРОВОЕ масштабирование.
Я ни сколько не глумился =) Сказал абсолютно серьезно. Не будет никакого векторного масштабирования растрового изображения. Оно по-любому будет таким же, как если бы просто картинку масштабировать, без спрайта.


Часовой пояс GMT +4, время: 07:43.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.