Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.06.2015, 09:47
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 31  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
у любой технологии есть ограничения - браузерный плагин не может пользовать постоянную память, как десктопное (любой графический редактор) - это нельзя не учитывать при планировании.

может, использовать аналогию работы гугл-мэп? систему тайлов, где невидимые тайлы удаляются и освобождают системную память, а при необходимости подгружаются с сервера?

Старый 07.06.2015, 01:40
Alex626 вне форума Посмотреть профиль Отправить личное сообщение для Alex626 Найти все сообщения от Alex626
  № 32  
Ответить с цитированием
Alex626

Регистрация: Sep 2010
Сообщений: 167
Я могу разбить одну BitmapData на несколько штук поменьше, затем каждую преобразовать в ByteArray и потом все ByteArray склеить в один, и сохранить. НО! Как я буду склеивать их? Ведь энкодеры дают готовый набор байтов уже с заголовками, да и я думаю ещё с какими-то особенностями, так что простая конкатенация не сработает.

Старый 07.06.2015, 04:33
meiciuc вне форума Посмотреть профиль Отправить личное сообщение для meiciuc Найти все сообщения от meiciuc
  № 33  
Ответить с цитированием
meiciuc

Регистрация: Nov 2005
Сообщений: 149
в одном из сообщений выше я давал ссылку на Алхимический проект - сейчас даю уточняющую ссылку - https://code.google.com/p/in-spirit/wiki/PNGEncoder

там как раз то, что нужно - возможность склеивать ну просто огромные картинки

пару лет назад у меня был проект, где надо было огромный мувик преобразовывать в bytearray и отправить на сервер. Мувик был гигантский и просто скопировать в битмапдату было нельзя. Помог проект по-ссылке.

Суть видна и в коде РАБОЧЕГО примера, но на всякий случай продублирую тут:
1. совершенно не обязательно для начала иметь исходный битмап - в моем случае это был контейнер с нарезанными битмапами (а-ля тайлы). Флэш плеер никак не ограничивает размер спрайта - только оперативка.
2. кодировщику в качестве параметра передается экземпляр PNGEncoderInfo в котором есть ссылка на метод, который будет "нарезать" единую "картинку" (контейнер с тайлами) на битмапы. Т.е. - имеется мувик-контейнер, который будет скармливаться энкодеру кусочками битмапов, которые, в свою очередь, будут склеиваться в единый ByteArray внутри этого самого энкодера.

надеюсь, поможет

В моем случае, когда код запускался на машине с (дай Бог памяти) 512 MB, изображения кодировались в ByteArray размером до 100 млн. пикселей. На 4 гигах оперативки кодировались картинки такого размера, что их браузер отобразить не может - можно было только скачать с сервака и в графических редакторах увидеть результат.

Старый 07.06.2015, 13:35
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 34  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Цитата:
Сообщение от Alex626 Посмотреть сообщение
А как-то можно обойти ограничение размера BitmapData.Draw? У меня в системе памяти не хватает на масштабы более 234% (это где-то 20.000 х 20.000 пикс.).
Дык замените

Код AS3:
private function encode(bitmapData:BitmapData):void
{
	var jpeg:JPEGEncoderOptions = new JPEGEncoderOptions();
		jpeg.quality = 4;
 
	var byteArray:ByteArray = bitmapData.encode( bitmapData.rect, jpeg);
 
	save( byteArray );
}
на

Код AS3:
private function encode(bitmapData:BitmapData):void
{	var j:JPEGAsyncEncoder = new JPEGAsyncEncoder(85);
	j.PixelsPerIteration = 300;
	j.addEventListener(JPEGAsyncCompleteEvent.JPEGASYNC_COMPLETE, handleJPEGEncoder);
	j.addEventListener(ProgressEvent.PROGRESS, handleProgress);
	j.encode(bitmapData);
}
Добавлено через 1 минуту
снимайте битмапу частями и асинхронно конвертируйте

Добавлено через 19 минут
Цитата:
Сообщение от Alex626 Посмотреть сообщение
НО! Как я буду склеивать их? Ведь энкодеры дают готовый набор байтов уже с заголовками, да и я думаю ещё с какими-то особенностями, так что простая конкатенация не сработает.
Подсмотрев сюда

Код AS3:
public function encode(image:BitmapData):ByteArray
                {
                        // Initialize bit writer
                        byteout = new ByteArray();
                        bytenew=0;
                        bytepos=7;
 
                        // Add JPEG headers
                        writeWord(0xFFD8); // SOI
                        writeAPP0();
                        writeDQT();
                        writeSOF0(image.width,image.height);
                        writeDHT();
                        writeSOS();
 
 
                        // Encode 8x8 macroblocks
                        var DCY:Number=0;
                        var DCU:Number=0;
                        var DCV:Number=0;
                        bytenew=0;
                        bytepos=7;
                        for (var ypos:int=0; ypos<image.height; ypos+=8) {
                                for (var xpos:int=0; xpos<image.width; xpos+=8) {
                                        RGB2YUV(image, xpos, ypos);
                                        DCY = processDU(YDU, fdtbl_Y, DCY, YDC_HT, YAC_HT);
                                        DCU = processDU(UDU, fdtbl_UV, DCU, UVDC_HT, UVAC_HT);
                                        DCV = processDU(VDU, fdtbl_UV, DCV, UVDC_HT, UVAC_HT);
                                }
                        }
 
                        // Do the bit alignment of the EOI marker
                        if ( bytepos >= 0 ) {
                                var fillbits:BitString = new BitString();
                                fillbits.len = bytepos+1;
                                fillbits.val = (1<<(bytepos+1))-1;
                                writeBits(fillbits);
                        }
 
                        writeWord(0xFFD9); //EOI
                        return byteout;
                }
можно увидеть
Код AS3:
 
// Add JPEG headers
writeWord(0xFFD8); // SOI
writeAPP0();
writeDQT();
writeSOF0(image.width,image.height);
writeDHT();
writeSOS();
соответствено нужно вывести длинну заголовка, и вырезать его перед склейкой.
Только в данном случае стоит учесть что пережимка осужествляется по X, а значит что обычная конкатенация даст распад изображения. Потому или однопиксельная горизонтальная нарезка, или PixelBender перед снятием битмапдаты, который пересоберёт картинку. Но это помоему уже велосипеды
__________________
return this...

Старый 08.06.2015, 19:09
Alex626 вне форума Посмотреть профиль Отправить личное сообщение для Alex626 Найти все сообщения от Alex626
  № 35  
Ответить с цитированием
Alex626

Регистрация: Sep 2010
Сообщений: 167
В общем, соглашусь, что всё это костыли. Поставлю заставку на время кодирования. Всё равно нативный кодер максимум 10 секунд отнимает, это нормально.

У меня последнее предположение насчёт ограничения BitmapData.Draw на компьютерах. Если флеш зависит от размера оперативной памяти, а плеер 32-битный, то скорее всего программе будет максимально доступно только 3,3 Гб. Если я сделаю 64-битное приложение под десктопы на Air, будет ли оно работать там лучше и без ограничений?

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:49.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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