Цитата:
Сообщение от 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 перед снятием битмапдаты, который пересоберёт картинку. Но это помоему уже велосипеды