Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Сглаживание/размытие краев битмапа. (http://www.flasher.ru/forum/showthread.php?t=138482)

udaaff 08.04.2010 23:58

Сглаживание/размытие краев битмапа.
 
Отрисовываю кусок изображения в битмапдату. Получается вот это вот http://test.typing.by/sample.png т.е. края изображения пиксельные. Подскажите, каким образом их можно размыть или отрисовать таким образом, чтобы оно со сглаженными краями получилось?

Zebestov 09.04.2010 00:03

а как отрисовываешь? картинку под маску и потом этот бутерброд в прозрачную битмапдату? или как-то хитрее/проще?

ps_spectre 09.04.2010 00:04

smothing = true битмапе (в конструкторе последний параметр)
и если отрисовка через draw то последний параметр smothing тоже true поставить.

udaaff 09.04.2010 00:11

smothing не помог.

Цитата:

Отрисовываю кусок изображения в битмапдату.
Не так описал, извиняюсь. Копируется изображение прямоугольной формы изначально, а затем с помощью метода threshold вырезаются эти загогулины (типа пазл).
Как всё это безобразие теперь сгладить?

ps_spectre 09.04.2010 00:17

а, так получается картинка изначально с "лесенкой" (аллиасингом) ?
вообщем, небольшой тестовый код, на котором проблема или исходную картинку не помешало бы, чтобы вместе думать над проблемой.
----
если исходник картинки с "лесницой", тогда сглаживание программно сделать наверно нельзя. Как очень крайняя мера, можно блюр-фильтр повесить, аля
_imgBD.applyFilter(_imgBD, _imgBD.rect, new Point(), new BlurFilter(3,2,1));
только вот, это как-то не красиво и собственно проблему решить это не поможет, так, самую малость замылит.)

udaaff 09.04.2010 00:29

Код AS3:

var map:BitmapData = new BitmapData(800, 800);
map.draw(new PuzzleMap()); // PuzzleMap — мувиклип, с заливками нескольких цветов. Аля карта с пазлами.
 
// инстанциируем исходное изображение. Какое-то изображение, кусок из которого будет вырезаться
image = new Art2(800, 800);
 
// цвет одной из заливок в PuzzleMap           
var currentPuzzleColor:Number = 0xFF000000;
 
// границы этого цвета         
var puzzleBounds:Rectangle = map.getColorBoundsRect(0xFFFFFFFF, currentPuzzleColor, true);
 
// создаем битмапдату по размерам цвета
var croppedImage:BitmapData = new BitmapData(puzzleBounds.width, puzzleBounds.height, true, 0xFFFFFFFF);
 
// копируем кусок исходного изображения в границах цвета
croppedImage.copyPixels(image, puzzleBounds, new Point(0, 0), image, new Point(0, 0), true);
 
// стираем все пиксели соответствующие пикселям map, которые не равны текущему цвету currentPuzzleColor
croppedImage.threshold(map, puzzleBounds,
new Point(0, 0), "!=", currentPuzzleColor, 0x00000000, 0xFFFFFFFF);
 
var puzzle:Puzzle = new Puzzle(croppedImage);
puzzle.x = 100;
puzzle.y = 100;
root.addChild(puzzle);

Код в классе Puzzle
Код AS3:

public function Puzzle(bitmapData:BitmapData)
{
    //TODO: implement function
    super();
 
    this.bitmapData = bitmapData;
    init();
}
 
private var bitmap:Bitmap;
private var bitmapData:BitmapData;
 
private function init():void
{
    //cacheAsBitmap = true
    var bmd:BitmapData = bitmapData.clone();
    //bmd.applyFilter(bmd, bitmapData.rect, new Point(0, 0), new BlurFilter(4, 4, 1));
    //bmd.draw(bitmapData);
  // bmd.applyFilter(bmd, bmd.rect, new Point(0, 0), new BevelFilter());
    bitmap = new Bitmap(bmd, PixelSnapping.AUTO, true); // что с тру, что без тру один черт
 
    bitmap.filters = [ new BevelFilter(4, 45, 0xFFFFFF, 1, 0x000000, 1, 4, 4, 1, 1, "inner", false ) ];
 
    //bitmap.smoothing = true
    addChild(bitmap);
}

upd:
Такой вариант придумал:
Код AS3:

 
        private function init():void
        {
            var bmd:BitmapData = bitmapData.clone();
            var bounds:BitmapData = bitmapData.clone();
            bounds.applyFilter(bounds, bitmapData.rect, new Point(0, 0), new BlurFilter());
            bounds.applyFilter(bounds, bitmapData.rect, new Point(0, 0),
                new BevelFilter(4, 45, 0xFFFFFF, 1, 0x000000, 1, 4, 4, 1, 1, "inner", true ));
            bmd.draw(bounds);
 
            bitmap = new Bitmap(bmd);
            addChild(bitmap);
        }

Но не покидает чувство, что через одно место это всё.

Zebestov 09.04.2010 01:08

только что просто положил в спрайт картинку с маской по форме паззла и отрисовал этот спрайт в новую битмапдату. красиво, края гладкие. и ощущение такое, что нормально это =)

Rzer 09.04.2010 01:10

Нарисуй в одну битмапку маску чернобелую, и скопируй в альфаканал картинки.

ps_spectre 09.04.2010 01:13

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

Zebestov 09.04.2010 01:15

Rzer предложил элегантный и быстрый вариант. смотри BitmapData#copyChannel().


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

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