Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   High quality Resize Crop And Upload IMG (http://www.flasher.ru/forum/showthread.php?t=182322)

AlexCooper 19.07.2012 13:59

High quality Resize Crop And Upload IMG
 
Доброго время суток.
Нужно повысить качество сжатия изображения при выгрузке. Суть в том что если пользователь выгружает большое изображения к примеру 1024х840, размер окна для обрезки изображения всеголишь в 420х420. Картинка в итоге очень плохо отображается. На выходе мы должны получить три размера, 250х250, 114х114 и 65х65.
Делаю это так
Код AS3:

private function createBitmap(e:MouseEvent=null):void {
 
        if (!BitmapMatrix.init) {
                BitmapMatrix.init = true;
 
                BitmapMatrix.size = new Array(250,114,65); // Нужные размеры
                BitmapMatrix.status = new Array(); // Статус готовности
                BitmapMatrix.Bitmapdata = new Object(); // Объект для храрения битмапдаты
                BitmapMatrix.Bitmap = new Object(); // Объект для храрения битмапов
        }
 
        img_preview.mask = null; // Удаляем маску
 
        for (var index in BitmapMatrix.size) // перебираем нужные размеры
        {
 
                // Определяем коефициент на который подгонит изображение пож нужный размер
                var factor = BitmapMatrix.size[index]/Math.min(img_preview.img.height,img_preview.img.width);
 
 
                // Подгонка изображения
                img_preview.img.height *= factor;
                img_preview.img.width *= factor;
 
                BitmapMatrix.status[BitmapMatrix.size[index]] = true; // Устанавливаем статус готовности
 
                // Создаём  битмапдату
                BitmapMatrix.Bitmapdata[BitmapMatrix.size[index]] = new BitmapData(BitmapMatrix.size[index], BitmapMatrix.size[index]);
 
                // Создаём битмап
                BitmapMatrix.Bitmap[BitmapMatrix.size[index]] = new Bitmap(BitmapMatrix.Bitmapdata[BitmapMatrix.size[index]]);
 
                // Снимаем снимок
                BitmapMatrix.Bitmapdata[BitmapMatrix.size[index]].draw(img_preview);
        }
        //viewborder.visible = true;
 
        img_preview.mask = masked; // Устанвлавием макску
 
        addChild(BitmapMatrix.Bitmap[250]); // Делаем тестовый спрайт
        //stabilizationCSS();
}

Выгрузка на сервер
Код AS3:

private function uploadBitmap($size):void {
 
        try {
                cache.temp = cache.send.response;
        } catch (e:Error) {};
 
 
        var header:URLRequestHeader = new URLRequestHeader("Content-type","application/octet-stream");
        var loader = new URLLoader("http://server.com/upload.php?name="+cache.name);
        var jpg:JPGEncoder = new JPGEncoder(80);
        var ba:ByteArray = jpg.encode(BitmapMatrix.Bitmapdata[$size]);
 
        var myRequest:URLRequest = new URLRequest(s);
 
        myRequest.requestHeaders.push(header);
        myRequest.method = URLRequestMethod.POST;
        myRequest.data = ba;
 
        loader.load(myRequest);
 
        loader.addEventListener(Event.COMPLETE,uploadBitmapControl);
}

PHP код:

<?php
if ( isset ( $GLOBALS["HTTP_RAW_POST_DATA"] ))
{
    
$line $_GET['name'];
    
    
$im $GLOBALS["HTTP_RAW_POST_DATA"];


    
$fp fopen($line'wb');
    
fwrite($fp$im);
    
fclose($fp);

    
//echo the fileName;
    
echo $line;
}  else echo 
'result=An error occured.';
?>


Aquahawk 19.07.2012 14:32

По хорошему слать бы на сервер только картинку и размеры региона которые юзер указал, и потом качественно обрабатывать. Вот вам на затравку http://habrahabr.ru/post/99108/

AlexCooper 20.07.2012 03:14

Спасибо сделал несколько по другому. Точнее сам допустил ошибку, делал скрин с окна которое и отображало только 420х420 пикселя, а подгружаемое изображение ресайзилось в нём. Выходом было следующие.
Помещаем изображение в спрайт. Подганяем под размер отображаемого окна. А процесс обрезки происходит так, сначало получаем координаты напрявляющих для обрезания изображения. Координаты переводим в координаты и масштаб ресайзнутого изображения. Делаем большой скрин. Почему большой потому что изображение может не иметь размера 250х250 (это минимум). Получаем новую битмапу. Новую битмапу подганяем под размер желаемые размеры и соответсвенно на каждой итерации снимаем нужного размера битмапы. Качество при этом ухудшилось на 2-3% + не задействовали сервер. + Есть козыр, фтошоповский эффект наложения антиблюр написанный на AS3. Кому интересно пиши в лс. Поделюсь опытом.

Wolsh 20.07.2012 03:39

В следующий раз, пожалуйста, называйте темы в соответствии с правилами форума. То есть по-русски.


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

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