Форум 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

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

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

aQuestion 04.01.2008 00:11

ха, так что мешает писать все альфы = 255 и пропускать при чтении? и вообще, разве нет в ас3 специально предусмотренной возможности грузить совершенно левые файлы?

Ноябрь 04.01.2008 00:26

Цитата:

так что мешает писать все альфы = 255 и пропускать при чтении
можно подробнее, непонятно как-то..

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

aQuestion 04.01.2008 01:33

попо дробнее: альфа=255 байт1 байт2 байт3 255 байт4 байт5 байт6 255 байт7 байт8...

попо воду других файлов, я имел ввиду URLLoader и его событие Event.COMPLETE, где можно извлечь необходимый файл где-то как
Код:

function onComplete( e:Event ):void
{
        var fileLoader = URLLoader( e.target );
        var file = fileLoader.data;
}

пнг таким способом грузить тоже никто не запрещает.

BlooDHounD 04.01.2008 03:18

Цитата:

пнг таким способом грузить тоже никто не запрещает.
только нужно не забыть распоковать :) lzw

aQuestion 04.01.2008 03:29

lzw вроде в gif?

BlooDHounD 04.01.2008 14:40

и там тоже. 2 релегиозно близких формата. например png-8 от gif вообще не отличается.

etc 04.01.2008 15:10

Наличием альфа прозрачности :)

BlooDHounD 04.01.2008 15:56

в png-8 нет альфы :) как и в гифе. есть флаг цвета указывающий на прозрачность. только png-8 не поддерживает анимацию.

etc 04.01.2008 16:08

Значит мой Fireworks читер :D

http://etcs.ru/files/png8_alpha.png

А вот и сам PNG8 с альфа-прозрачностью:

http://etcs.ru/files/png8_with_alpha.png

Ноябрь 04.01.2008 17:43

aQuestion
а зачем их пропускать, они же пиксели...:wacko:

aQuestion 04.01.2008 19:54

ты ж сказал что хочешь массив загрузить через картинку.

Ноябрь 05.01.2008 00:25

ну я вроде и загружаю..
Зачем при этом пропускать байты с альфой?
Не пойму я как ты хочешь сделать..

BlooDHounD 05.01.2008 03:59

Видимо да, потому что фотошот так не умел. как минимум в 7й версии.
по ходу у png-8 можно палирту составлять с альфой. фотошоп раньше не умел. наверно сейчас умеет, я его не юзал уже года 3.

aQuestion 05.01.2008 17:36

Цитата:

Сообщение от Ноябрь
Зачем при этом пропускать байты с альфой?

чтобі иметь возможность туда вписать 255, и получить свой массив в неизменённом виде.

Ноябрь 07.01.2008 23:07

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

etc 07.01.2008 23:08

Объяснили же, что альфу отдельно, цвета отдельно. Если все вместе, то будут искажения. Так яснее?

aQuestion 07.01.2008 23:26

я вообще думал что речь про абстрактній массив чисел, а не о картинке.


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

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