Показать сообщение отдельно
Старый 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...