Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как уменьшить разрешение Bitmap'а? (http://www.flasher.ru/forum/showthread.php?t=145417)

Tr1te 07.10.2010 11:05

Как уменьшить разрешение Bitmap'а?
 
Можно ли уменьшить разрешение Bitmap'а? Или надо самому отрисовывать по пикселям усредняя цвет? Кто нибудь это делал, меня интересует как долго это происходит, например 4000х4000 уменьшить вдвое.

i.o. 07.10.2010 11:11

отрисовать через BitmapData#draw( исходный_битмап ) с матрицей, к которой применен scale( 0.5, 0.5 )

Tr1te 07.10.2010 11:12

Отлично, спасибо, думал будет гораздо сложнее.

Obi 07.10.2010 11:14

Bitmap — это наследник класса DisplayObject, следовательно можно воспользоваться сеттерами scaleX и scaleY, без необходимости менять исходную битмапдату и забивать память лишними картинками.

Tr1te 07.10.2010 11:16

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

Obi 07.10.2010 12:24

> Разрешение при этом не меняется, изменяется размер отображения, но твой проц все равно будет обрабатывать все 4000х4000 пикселей
Откуда такая информация?

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

Tr1te 07.10.2010 12:30

Obi, у меня другая практика и разница в производительности огромная. Может в отображении одной картинке и не видна разница, но это не доказывает что ее - нет. Но когда я скейлю 200 картинок, то начинаются безумные тормоза при отображении. FPS падает в 5+ раз.

-De- 07.10.2010 12:33

А можно код теста?
Если кеширует, то не понятно, зачем нужен cacheAsBitmap, например. И вообще интересно.

i.o. 07.10.2010 12:44

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

Obi 07.10.2010 13:02

50 картинок. Все еще не вижу разницы.
Код AS3:

const MATRIX_SCALING:Boolean = false;
 
var bitmapVector:Vector.<Bitmap> = new Vector.<Bitmap>();
 
generateBitmaps(50);
 
function generateBitmaps(count:int):void {
        while(count-- > 0) {
                var bmd:BitmapData = new BitmapData(1000, 1000, true, 0xFF << 24 | Math.random()*0xFFFFFF);
                brbrBitmapData(bmd);
 
                var scaleFactor:Number = 0.3;
 
                var bm:Bitmap;
                if(!MATRIX_SCALING) {
                        bm = new Bitmap(bmd);
                        bm.scaleX = bm.scaleY = scaleFactor;
                }else {
                        var mtx:Matrix = new Matrix();
                        mtx.scale(scaleFactor, scaleFactor);
 
                        var scaledBmd = new BitmapData(bmd.width*scaleFactor, bmd.height*scaleFactor);
                        scaledBmd.draw(bmd, mtx);
                        bm = new Bitmap(scaledBmd);
                }
 
                bm.x = Math.random()*stage.stageWidth/2;
                bm.y = Math.random()*stage.stageHeight/2;
                addChild(bm);
                bitmapVector.push(bm);
        }
}
 
addEventListener(Event.ENTER_FRAME, enterFrameHandler);
 
function enterFrameHandler(event:Event):void {
        var len:int = bitmapVector.length;
        for(var i:int = 0; i < len; i++) {
                var bm:Bitmap = bitmapVector[i];
                bm.rotation ++;
        }
}
 
// just fun
function brbrBitmapData(bitmapData:BitmapData):void {
        var len:int = (bitmapData.width * bitmapData.height) / 10;
        for(var i:int = 0; i < len; i++) {
                bitmapData.setPixel32(Math.random()*bitmapData.width, Math.random()*bitmapData.height, Math.random()*0xFFFFFFFF);
        }
}
 
var fpsTextField:FPSBox = new FPSBox();
fpsTextField.textColor = 0xFFEA2B;
addChild(fpsTextField);

> Если кеширует, то не понятно, зачем нужен cacheAsBitmap

Это и есть Bitmap. cashAsBitmap - Bitmap. Тафтология.

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

Сообщение от i.o. (Сообщение 941419)
Человек уже получил вопрос, как ему уменьшить разрешение. Зачем докапываться "а для каких вам целей", да "плеер не дурак".. лишь бы пооффтопить - для этого флейм есть.

Это не флейм, а выяснение истины. Всем будет полезно узнать, например, что scale медленнее, чем трансформация bitmapDat'ы с помощью матрицы, или наоборот. Если вам не интересно — проходите мимо.

UPD: уменьшил размер битмапдат и нагенерировал заявленные 200 штук. Разницы все равно не увидел.
UPD2: в качестве счетчика фпс был использован класс FPSBox отсюда: http://blog.efnx.com/wp-content/uplo...113.src.tar.gz


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

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