Модераторы: SoWa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> сохранение Bitmap на сервер, даешь online фотошоп! 
:(
    Опции темы
AlDev
Дата 12.9.2006, 17:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



Итак, вот классик с комментами. Писать статью мне ессно лень и отсутствует время.

Шо это делает? Отправляет сриншот объекта определенного на сервер. Исходник сервера тут же.
То есть можно сделать фотошоп online smile

Код

package ru.z3studio.batsuev.net
{
    import flash.utils.ByteArray;
    import flash.net.Socket;
    import flash.events.IEventDispatcher;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.events.SecurityErrorEvent;
    import flash.events.ProgressEvent;
    import flash.display.IBitmapDrawable;
    import flash.display.BitmapData;
    import flash.geom.Rectangle;

    /**
     * Класс для отправки изображений на сервер
     * @author Alex S Batsuev aka AlDev
     *  http://batsuev.z3studio.ru
     *  mail:[email protected]
     * @date 12 сентября 2006
     */
    public class BitmapSaver
    {
        private var socket:Socket;
        private var data:ByteArray;
        private var rect:Rectangle;
        
        /**
         * Конструктор класса, создает сокет для связи с сервером и получает данные о битмапе
         * @param bitmapDrawable:IBitmapDrawable объект, с которого будем делать снимок
         * @param rect:Rectangle границы снимка
         * @return Объект класса BitmapSaver
         **/
        public function BitmapSaver(bitmapDrawable:IBitmapDrawable,rect:Rectangle)
        {
            //создадим объект класса BitmapData
            var bitmapData:BitmapData = new BitmapData(rect.width,rect.height);
            //занесем в него данные изображения
            bitmapData.draw(bitmapDrawable);
            //получим ByteArray пикселей
            //хранятся в нем значения цветов слева направо сверху вних картинки
            //каждое значение по 4 байта - ARGB
            //причем uint
            this.data = bitmapData.getPixels(rect);
            //создадим сокет
            this.socket = new Socket();
            //и сконфигурируем его листенеры
            this.configListeners(this.socket);
            //запомним размеры
            this.rect = rect;
        }
        
        /**
         * метод send. Коннектится к серверу и начинает слать ему данные
         * @param host:String адрес сервера
         * @param port:uint порт, который слушается сервером
         **/
        public function send(host:String, port:uint):void
        {
            this.socket.connect(host,port);
        }
        
        /**
         * метод configListeners. Конфигурирет листенеры для сокета
         * @param dispatcher:IEventDispatcher наш сокет
         */
        private function configListeners(dispatcher:IEventDispatcher):void
        {
            //событие на подключение
            dispatcher.addEventListener(Event.CONNECT, this.connectHandler);
            //событие на получение данных от сервера
            dispatcher.addEventListener(ProgressEvent.SOCKET_DATA, this.progressHandler);
        }
        
        /**
         * хэндлер на событие подключения к серверу
         **/        
        private function connectHandler(event:Event):void
        {
            //отправим ширину
            this.socket.writeInt(this.rect.width);
            //отправим высоту
            this.socket.writeInt(this.rect.height);
            //отправим данные битмапа            
            this.socket.writeBytes(this.data,0,this.data.bytesAvailable);
        }
        
        /**
         * хэндлер на получение данных от сервера
         **/
        private function progressHandler(progressEvent:ProgressEvent):void
        {
            this.socket.close();
        }
    }
}


Ну и серверная часть:
Код

package src;

import java.net.ServerSocket;
import java.net.Socket;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.imageio.ImageIO;

/**
 * Класс для создания серверного сокета и приема подключений
 * @author Alex S Batsuev
 */
public class ImageSaver 
{
    private ServerSocket serverSocket;
    
    public ImageSaver()
    {
        try
        {
            //создадим серверный сокет на 1020 порту
            this.serverSocket = new ServerSocket(1020);
            this.init();
        }catch (IOException ex)
        {
            //если создать не получилось, убиваем себя аб стенку
            ex.printStackTrace(System.err);
            System.exit(-1);
        }
    }
    
    private void init()
    {
        //обрабатываем подключения к серверу
        while (true)
        {
            try
            {
                //когда происходит подключение создаем новый Socket
                Socket s = this.serverSocket.accept();
                //создадим обработчик соединения
                ConnectionParser parser = new ConnectionParser(s);
                //создадим новый тред для возможности одновременной работы с несколькими пользователями
                Thread t = new Thread(parser);
                //пустим потом
                t.start();
            }catch (IOException ex)
            {
                //в случае ошибки выдадим сообщение
                System.err.println("accept failed");
            }
        }
    }
    
    public static void main(String[] args) 
    {
        //создадим сервак
        AdvertisementServer advertisementServer = new AdvertisementServer();
    }
}

/**
 * Класс для обработки данных от клиента
 * @author Alex S Batsuev
 */
class ConnectionParser implements Runnable
{
    //сокет
    private Socket socket;
    //поток входящих данных с сервера
    private InputStream inputStream;
    
    /**
     * конструктор класса
     * @param s Socket подключившийся к серверу сокет
     */
    public ConnectionParser(Socket s)
    {
        //установим ссылку на сокет
        this.socket = s;
    }
    
    /**
     * определим метод, срабатывающий при пуске треда
     */
    public void run() 
    {
        try 
        {
            //получим поток данных
            this.inputStream = this.socket.getInputStream();
            //считаем из него ширину (4 байта)
            int width = this.inputStream.read()*0x1000000;
            width += this.inputStream.read()*0x10000;
            width += this.inputStream.read()*0x100;
            width += this.inputStream.read();
            //далее считаем высоту (4 байта)
            int height = this.inputStream.read()*0x1000000;
            height += this.inputStream.read()*0x10000;
            height += this.inputStream.read()*0x100;
            height += this.inputStream.read();
            //создадим массив для байтов изображения (на сколько вы помните там все по 4 байта
            //ибо ARGB
            byte[] bytes = new byte[width*height*4];
            //количество считаных байт
            int readed = 0;
            //читаем из потока все что можно до того, сколько нужно
            while (readed<(width*height*4))
            {
                int nowRead = this.inputStream.read(bytes,readed,this.inputStream.available());
                readed += nowRead;
            }
            //создаем файл изображения из этих данных
            this.createImageFile(width,height,bytes);
        } catch (IOException e) 
        {
            e.printStackTrace(System.err);
            this.socket = null;
        }
    }
    
    private void createImageFile(int width, int height,byte[] bytes)
    {
        //сформируем массив RGB
        int[] argb = new int[bytes.length/4];
        int index = 0;
        int r,g,b;
        for (int i=0;i<bytes.length;i++)
        {
            //преобразуем unsigned в signed
            r = 0xFF & bytes[i+1];
            g = 0xFF & bytes[i+2];
            b = 0xFF & bytes[i+3];
            //запишем значение RGB
            argb[index] = r*0x10000+g*0x100+b;
            i+=3;
            index++;            
        }
        //Создадим bufferedImage типа RGB (без альфа-канала)
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_3BYTE_BGR);
        index = 0;
        int colIndex = 0;
        int rowIndex = 0;
        //нарисуем его ручками
        while (index<argb.length)
        {
            image.setRGB(colIndex, rowIndex, argb[index]);
            colIndex++;
            if (colIndex>=width)
            {
                rowIndex++;
                colIndex = 0;
            }
            index++;
        }
        try 
        {
            //и сохраним как jpg
            ImageIO.write(image,"jpg", new File("C:\\test.jpg"));
        }catch (IOException e) 
        {
            e.printStackTrace(System.err);
        }
        //отправим клиенту 1 в знак того, что все сделано
        this.sendSuccefulyPacket();
    }
    
    private void sendSuccefulyPacket()
    {
        try {
            //получим outputStream с сокета
            OutputStream outputStream = this.socket.getOutputStream();
            //запишем туда 1
            outputStream.write(1);
            //и закроем поток
            outputStream.close();
        } catch (IOException e) 
        {
            e.printStackTrace(System.err);
            this.socket = null;
        }
    }
}


Добавлено @ 17:54 
ЗЫ: http://batsuev.z3studio.ru/?p=18
ток не знаю что назвать оригиналом =)
PM MAIL WWW ICQ YIM MSN   Вверх
Maksys
Дата 13.9.2006, 06:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Future Splasher
***


Профиль
Группа: Завсегдатай
Сообщений: 1289
Регистрация: 15.6.2005
Где: Екатеринбург

Репутация: нет
Всего: 17



И когда у тебя бывает время это все делать?


--------------------
 С уважением, BiMaWa™©.
user posted image
user posted image
PM MAIL ICQ Skype GTalk   Вверх
AlDev
Дата 13.9.2006, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный идиотъ
***


Профиль
Группа: Участник Клуба
Сообщений: 1927
Регистрация: 17.4.2005
Где: Irk, rus

Репутация: 10
Всего: 50



была задачка написать создавалку баннеров для сайта. чтоб народ мог рисовать баннер на ходу.
Ну а это частность этой фигни =)
PM MAIL WWW ICQ YIM MSN   Вверх
DanKey
  Дата 30.11.2006, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 29.11.2006

Репутация: нет
Всего: нет



Косяг:

Код

        //создадим сервак
        AdvertisementServer advertisementServer = new AdvertisementServer();

=>
Код

        //создадим сервак
     ImageSaver advertisementServer = new ImageSaver();

 smile 

И ещё при коннекте на порт ниже 1024 траблы с полиси (<policy-file-request />) начинаются.

А так все работает, thanxUverymuch! 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | ActionScript 3 | Следующая тема »


 




[ Время генерации скрипта: 0.0685 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.