Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Erise "проявляется" при сборе BitmapData с клипа. (http://www.flasher.ru/forum/showthread.php?t=117836)

elniko 07.11.2008 22:51

Erise "проявляется" при сборе BitmapData с клипа.
 
У меня есть клип main_mc с .blendMode = "layer";
в него вложены клипы с .blendMode = "erase";

при присмотре флешки все ок -- клипы-эрайсеры работают как маска, НО когда я преобразую main_mc в BitmapData, то erase-клипы становятся видны, не выполняют функцию маски....

код отправки битмапа скрипту:

Код:

        var data_bmp:BitmapData = new BitmapData(glHolstW,glHolstH);
        data_bmp.draw(main_mc);
        var png_image_data:ByteArray = PNGEncoder.encode(data_bmp);

        var url_req:URLRequest=new URLRequest("img_create.php");
        url_req.data = png_image_data;
        url_req.method = URLRequestMethod.POST;

        var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
        url_req.requestHeaders.push(header);
        navigateToURL(url_req);

PNG Encoder

Код:

package {
        import flash.geom.*;
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.utils.ByteArray;

        public class PNGEncoder {
                public static function encode(img:BitmapData):ByteArray {
                       
                        var png:ByteArray = new ByteArray();
                        png.writeUnsignedInt(0x89504e47);
                        png.writeUnsignedInt(0x0D0A1A0A);

                        var IHDR:ByteArray = new ByteArray();
                        IHDR.writeInt(img.width);
                        IHDR.writeInt(img.height);
                        IHDR.writeUnsignedInt(0x08060000);
                        IHDR.writeByte(0);
                        writeChunk(png,0x49484452,IHDR);

                        var IDAT:ByteArray= new ByteArray();
                        for (var i:int=0; i < img.height; i++) {
                                IDAT.writeByte(0);
                                var p:uint;
                                var j:int;
                                if ( !img.transparent ) {
                                        for (j=0; j < img.width; j++) {
                                                p = img.getPixel(j,i);
                                                IDAT.writeUnsignedInt(uint(((p&0xFFFFFF) << 8)|0xFF));
                                        }
                                } else {
                                        for (j=0; j < img.width; j++) {
                                                p = img.getPixel32(j,i);
                                                IDAT.writeUnsignedInt(uint(((p&0xFFFFFF) << 8)|(p>>>24)));
                                        }
                                }
                        }
                        IDAT.compress();
                        writeChunk(png,0x49444154,IDAT);
                        writeChunk(png,0x49454E44,null);
                        return png;
                }
                private static  var crcTable:Array;
                private static  var crcTableComputed:Boolean = false;

                private static function writeChunk(png:ByteArray, type:uint, data:ByteArray):void {
                        if (!crcTableComputed) {
                                crcTableComputed = true;
                                crcTable = [];
                                var c:uint;
                                for (var n:uint = 0; n < 256; n++) {
                                        c = n;
                                        for (var k:uint = 0; k < 8; k++) {
                                                if (c & 1) {
                                                        c = uint(uint(0xedb88320) ^ uint(c >>> 1));
                                                } else {
                                                        c = uint(c >>> 1);
                                                }
                                        }
                                        crcTable[n] = c;
                                }
                        }
                        var len:uint = 0;
                        if (data != null) {
                                len = data.length;
                        }
                        png.writeUnsignedInt(len);
                        var p:uint = png.position;
                        png.writeUnsignedInt(type);
                        if ( data != null ) {
                                png.writeBytes(data);
                        }
                        var e:uint = png.position;
                        png.position = p;
                        c = 0xffffffff;
                        for (var i:int = 0; i < (e-p); i++) {
                                c = uint(crcTable[(c ^ png.readUnsignedByte()) & uint(0xff)] ^ uint(c >>> 8));
                        }
                        c = uint(c^uint(0xffffffff));
                        png.position = e;
                        png.writeUnsignedInt(c);
                }
        }
}


s8000_1 08.11.2008 01:17

Код:

var temp:Sprite = new Sprite();
temp.addChild(main_mc);

var data_bmp:BitmapData = new BitmapData(glHolstW,glHolstH);
data_bmp.draw(temp);


elniko 08.11.2008 03:04

Вложений: 1
Неа, нифига...В этом случае получается вот что:


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

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