Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   сохраняем в растр (PNGEncoder) (http://www.flasher.ru/forum/showthread.php?t=113116)

winsent 19.06.2008 10:41

сохраняем в растр (PNGEncoder)
 
Задача: загрузить картинку на ней нарисовать что либо и сохранить в растр.
Решение:
На форме есть MovieClip clip_mc рисование на нем реализованно так:

Код:

var child:Shape = new Shape();
clip_mc.addChild(child);
//
clip_mc.addEventListener(MouseEvent.MOUSE_DOWN, onMousedown);
stage.addEventListener(MouseEvent.MOUSE_UP, onMouseup);

function onMousedown(event:MouseEvent):void {
        var to_x = event.localX;
        var to_y = event.localY;
       
        child.graphics.lineStyle(10, 000000, 100, true, "normal", "");
        child.graphics.moveTo(to_x,to_y);
        clip_mc.addEventListener(Event.ENTER_FRAME, enterFrameW);
}
function onMouseup(event:MouseEvent):void {
        clip_mc.removeEventListener("enterFrame", enterFrameW);
}

function enterFrameW(event:Event):void {
        var m_x:Number = clip_mc.mouseX;
        var m_y:Number = clip_mc.mouseY;
        if ((m_x>2 && m_x<483) && (m_y>1 && m_y<275)) {
                child.graphics.lineTo(clip_mc.mouseX, clip_mc.mouseY);
        }
}

//Сохранение в растр используя PNGEncoder www.kaourantin.net
var bmp:BitmapData = new BitmapData(clip_mc.width,clip_mc.height,true,"0x000000");
        bmp.draw(clip_mc);
        var imagedata:ByteArray = PNGEncoder.encode(bmp);

// Далее результат отдаем php скрипту который складывает картинку

На Этом этапе все работает ОК
Проблемма как загрузить растр в clip_mc?

var loader:Loader = new Loader();
var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg");
loader.load(url);
clip_mc.addChild(loader); // <----- РАБОТАТЬ НЕ БУДЕТ, точнее будет но PNGEncoder не отработает

flash33 19.06.2008 10:55

У вас addChild сразу после метода load, а надо по событию COMPLETE/INIT
PS То есть растр то вы увидите, но обработчик энкодера будет брать пустой битмап

winsent 19.06.2008 11:15

Упростил. Ситуация выглядит так: Без строки clip_mc.addChild(loader); все работает (смотрю в логаАпача вызывается Send.php). Как только добавляю, в логах тишина (Send.php - не вызывается ). Т.е. не то чтобы берется пустой битмам, а вообще не отрабатывает.
Код:

import flash.display.*;
import flash.net.URLRequest;
import flash.net.URLVariables;
       
        var loader:Loader = new Loader();
        var url:URLRequest = new URLRequest("http://www.helpexamples.com/flash/images/image1.jpg");
        loader.load(url);
        clip_mc.addChild(loader);// МЕТКА (без этой строки работает)
       
function sendImage(event:Event) {
        var bmp:BitmapData = new BitmapData(clip_mc.width,clip_mc.height);
        bmp.draw(clip_mc);
        var png_image:ByteArray = PNGEncoder.encode(bmp);
        trace(png_image.length);
        var url_req:URLRequest = new URLRequest("http://serv/send.php");
        url_req.data = png_image;
        url_req.method = URLRequestMethod.POST;
        var header:URLRequestHeader = new URLRequestHeader ("Content-type", "application/octet-stream");
        url_req.requestHeaders.push(header);
        navigateToURL(url_req, "_self");
}
send_mc.addEventListener(MouseEvent.CLICK, sendImage); //Обработчик кнопки


winsent 19.06.2008 12:25

Т.е. Насколько я понимаю суть не в моменте аплоада.

wvxvw 19.06.2008 12:36

не хватает: loader.dataFormat = URLLoaderDataFormat.BINARY; (для отсылки)
И использовать URLLoader вместо navigateToURL

winsent 19.06.2008 15:57

Мда, еще упростил, теперь ситуация выглядит так, что-то прихоит к send.php, но структура нарушена и это уже соответственно не картинка.
Код:

import flash.display.*;
import flash.net.URLRequest;
import flash.net.URLVariables;
import flash.net.URLLoader;
       
function sendImage(event:Event) {
        var bmp:BitmapData = new BitmapData(clip_mc.width,clip_mc.height);
        bmp.draw(clip_mc);
        var png_image:ByteArray = PNGEncoder.encode(bmp);
       
//
       
        var request:URLRequest = new URLRequest("http://serv/send.php");
        request.data = png_image;
        request.method = URLRequestMethod.POST;
        var _loader:URLLoader = new URLLoader();
        _loader.dataFormat = URLLoaderDataFormat.BINARY;
        _loader.load(request);

}
send_mc.addEventListener(MouseEvent.CLICK, sendImage); //Обработчик кнопки


winsent 19.06.2008 16:33

Ой, необходимо добавить request.contentType = "application/octet-stream";

flash33 19.06.2008 16:37

Очень трудно гадать на кофейеой гуще, что у вас там в php находится... Вообще я это делаю так - перекодирую байтаррей в Base64 строку, запихиваю это в request.variables, на стороне сервака опять перекодирую строку в бинарный код и пишу в файл. Как делаете вы - одному Богу известно

winsent 19.06.2008 16:38

Ой, необходимо добавить
Код:

request.contentType = "application/octet-stream";

wvxvw 19.06.2008 16:56

flash33: Зачем? Это ж столько лишней инфы посылать?

Вот пример ПХП скрипта сохраняющего картинку (PNG)
Код:

<?php
session_start();
if ( isset ( $GLOBALS["HTTP_RAW_POST_DATA"] )){
        if(isset ($_SESSION['I'])) {
                $i = $_SESSION['I'] + 1;
                $_SESSION['I'] = $i;
        } else {
                $i = $_SESSION['I'] = 1;
        }
        $im = $GLOBALS["HTTP_RAW_POST_DATA"];
        $add = $i;
        if ($add < 10) {
                $add = "000" . $add;
        } else if ($add >= 10 && $add < 100) {
                $add = "00" . $add;
        }
        else if ($add >= 100 && $add < 1000) {
                $add = "0" . $add;
        }
        $filename = "pic" . $add . ".png";
        $fullFilePath = "uploads/" . $filename;
               
        $handle = fopen($fullFilePath, "w");
       
        fwrite($handle, $im);
        fclose($handle);
       
        echo "a=YES";
        exit();
} else {
        echo "a=NO";
        exit();
}
?>

Вот пример отпавки из флеша.
Код:

package phpconnect
{
       
        /**
        * ...
        * @author wvxvw
        */
        import flash.events.Event;
        import flash.events.EventDispatcher;
        import flash.events.IOErrorEvent;
        import flash.net.URLLoaderDataFormat;
        import flash.net.URLLoader;
        import flash.net.URLRequestHeader;
        import flash.net.URLRequest;
        import flash.net.URLRequestMethod;
        import flash.net.URLVariables;
        import flash.external.ExternalInterface;
        import flash.utils.ByteArray;
        import utilities.RenderEvent;
        import utilities.PlayerGenericEvent;
       
        import player_internal;
       
        public class Sender extends EventDispatcher
        {
                use namespace player_internal;
               
                internal var domain:String = 'save_png.php';
                internal var loader:URLLoader;
                internal var request:URLRequest;
                internal var header:URLRequestHeader;
                internal var vars1:URLVariables;
               
                public function Sender()
                {
                        loader = new URLLoader();
                        loader.dataFormat = URLLoaderDataFormat.BINARY;
                        request = new URLRequest(domain);
                        request.method = URLRequestMethod.POST;
                        header = new URLRequestHeader('Content-Type', 'application/octet-stream');
                        request.requestHeaders.push(header);
                       
                        loader.addEventListener(Event.COMPLETE, handleComplete);
                        loader.addEventListener(IOErrorEvent.IO_ERROR, handleError);
                }
                player_internal function send(ba:ByteArray):void
                {
                        request.data = ba;
                        loader.load(request);
                }
                player_internal function handleComplete(evt:Event):void
                {
                        var rvars:URLVariables = new URLVariables(evt.target.data);
                        dispatchEvent(new RenderEvent(RenderEvent.RENDER, true));
                }
                player_internal function handleError(evt:IOErrorEvent):void
                {
                        ExternalInterface.call('alert', 'FAILED!\r'+evt);
                        //dispatchEvent(new PlayerGenericEvent(EventList.GENERIC, 1));
                }
        }
       
}

Сорри, я не редактировал ничего, просто копипаст из работающего проекта, но, вроде ничего особо лишнего...


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

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