Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   работа с BitmapData неточные данные (http://www.flasher.ru/forum/showthread.php?t=106119)

Ноябрь 03.01.2008 16:31

работа с BitmapData неточные данные
 
Записываю BitmapData
Код:

imgbit.setPixels(rect,c);
trace(c[0],c[1],c[2],c[3]);//6 148 59 175

И тут же считываю
Код:

var imgbar1:ByteArray = imgbit.getPixels(rect);
trace(imgbar1[0],imgbar1[1],imgbar1[2],imgbar1[3]);//6 127 42 170

Почему байт массив изменился?

aQuestion 03.01.2008 17:14

пытаясь воспроизвести вышеописанную ситуацию, получил ещё эффект:
Код:

var c = new ByteArray();
c.length = 8;
c.writeByte (6);
c.writeByte (148);
c.writeByte (59);
c.writeByte (175);
trace(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7]);

imgbit.setPixels(rect,c);
c.writeByte (1);
c.writeByte (2);
c.writeByte (3);
c.writeByte (4);
trace(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7]);

output:
Цитата:

6 148 59 175 0 0 0 0
6 148 59 175 0 0 0 0
собственно, по вопросу: у вас альфа = 6, следовательно вместо 148 сохранится 6 * 148 / 255 = 3, а прочитается 3 * 255 / 6 = 127. аналогично 6 * 59 / 255 = 1, 1 * 255 / 6 = 42, и то же самое для 175. это слегка подзабытые мной грабли.

etc 03.01.2008 17:30

Потому что напрямую так с массивом не работают.

Ничего никуда не изменяется:
Код:

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.utils.ByteArray;
var bmp:BitmapData = new BitmapData(2,2,true,0);
var ba:ByteArray = new ByteArray();
ba.writeUnsignedInt(0xFFFFFFFF);
ba.writeUnsignedInt(0xFFFF0000);
ba.writeUnsignedInt(0xFF00FF00);
ba.writeUnsignedInt(0xFF0000FF);
ba.position = 0;
bmp.setPixels(bmp.rect, ba); // write
ba = bmp.getPixels(bmp.rect); // read
ba.position = 0;
while(ba.bytesAvailable) {
        trace('pixel color:','0x'+ba.readUnsignedInt().toString(16).toUpperCase());
}
addChild(new Bitmap(bmp));


aQuestion 03.01.2008 17:34

етц, а если писать ba.writeUnsignedInt(0x01345678); ?

etc 03.01.2008 18:03

Я думаю, некий смысл вытекает из этого:

Цитата:

Сообщение от Help
All pixels in a BitmapData object are stored as premultiplied color values. A premultiplied image pixel has the red, green, and blue color channel values already multiplied by the alpha data. For example, if the alpha value is 0, the values for the RGB channels are also 0, independent of their unmultiplied values. This loss of data can cause some problems when you perform operations. All BitmapData methods take and return unmultiplied values. The internal pixel representation is converted from premultiplied to unmultiplied before it is returned as a value. During a set operation, the pixel value is premultiplied before the raw image pixel is set.


Ноябрь 03.01.2008 19:01

premultiplied и unmultiplied это что за пиксели?

aQuestion
А выход-то какой, не злоупотреблять альфой?

aQuestion 03.01.2008 19:46

премультиплайед = предварительно умноженный (на альфу от 0 до 1)
анмультиплайед = не умноженный (или же разумноженный обратно)

в силу целочисленности конверсия из премультиплайед в анмультиплайед, очевидно, идёт с потерями.

выход - смотря из какой ситуации. в том топике, например, я пытался использвать альфу для хранения ч/б картинки, и мой выход, т.о., свёлся к использованию отдельного файла.

Ноябрь 03.01.2008 20:25

т.е избежал ситуации, когда необходимо получить данные из BitmapData?

aQuestion 03.01.2008 21:21

не, у меня просто была цветная картинка (карта) и ч/б (маска воды). я подумал что неплохо бы сэкономить, и запихнуть всё в один пнг. оказалось, что плохо.

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

Ноябрь 03.01.2008 21:48

хз.. как из пнг можно выделить альфа канал?

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


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

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