Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   JPGEncoder создает некорректный файл (http://www.flasher.ru/forum/showthread.php?t=212974)

abb 08.06.2016 09:55

JPGEncoder создает некорректный файл
 
Вложений: 1
Здравствуйте,

Копирую часть _root в BitmapData с масштабированием, а затем кодирую JPEGEncoder-ом. В результате получается с виду валидный файл (по крайней мере, он начинается с 0хFFD8,0xFFE0 и заканчивается 0xFFD9). Но файл никто не хочет открывать. Все пишут, что он поврежден или там что-то некорректное.

Проблема, которую я пытаюсь решить, состоит в довольно большом размере картинки, которую я пытаюсь создать в результате. Если пытаться создать BitmapData в полный размер (~8000x5000), то просто выскакивает ошибка. Поэтому я делю все на части и пытаюсь выдать по частям. При делении на 6x6 ошибки нет, но результат либо вообще без валидного терминатора, либо терминатор есть, но файл все равно ничем не открывается.

Код создания:
Код AS3:

public function getImgBinary(kX:Number, splitFactor:Number, outRectNumX:Number, outRectNumY:Number):String {
        // result size
        var szX:Number = Math.ceil(this.stage.stageWidth * kX / splitFactor);
        var szY:Number = Math.ceil(this.stage.stageHeight * kX / splitFactor);
        // capture size
        var capSzX:Number = Math.floor(this.stage.stageWidth / splitFactor);
        var capSzY:Number = Math.floor(this.stage.stageHeight / splitFactor);
        // capture start position
        var capX:Number =  outRectNumX * capSzX;
        var capY:Number =  outRectNumY * capSzY;
        // capture matrix
        var mtx:Matrix = new Matrix(kX, 0, 0, kX, -capX, -capY);
        // result
        var bmp:BitmapData = new BitmapData(szX, szY, false, 0xFFFFFFFF);
        bmp.draw(this, mtx, null, null, new Rectangle(0, 0, capSzX, capSzY), false);
        //
        //var b:ByteArray = PNGEncoder.encode(bmp);
        //
        var encoder:JPGEncoder = new JPGEncoder(100);
        var b:ByteArray = encoder.encode(bmp);
        //
        var b64:Base64Encoder = new Base64Encoder();
        b64.encodeBytes(b);
        return b64.toString();
}

Вариант с PNGEncoder-ом тоже дает аналогичный результат.
Полученный JPG файл присоединяю.

Пытался обновить сам код com.adobe.images.* с оф. сайта. Не помогает.

Заранее спасибо.

illuzor 08.06.2016 17:04

А если сохранить напрямую без преобразования в Base64?

abb 08.06.2016 18:47

Я из дельфевой проги его юзаю. Возврат из CallFunction - это XML-строка. Там нельзя бинарник засунуть.
Да и к тому же, если в конце файла валидный терминатор, то значит он до конца прошел через base64. Или что, base64 его кусками закодировал? Что-то не верится.

Но, если скажете, как можно по-простому передать бинарник - я, разумеется, попробую.

abb 08.06.2016 19:26

Вложений: 1
Попробовал возвращать еще и исходную длину бинарника:
Код AS3:

                        var b64:Base64Encoder = new Base64Encoder();
                        b64.encodeBytes(b);
                        var res:String;
                        res = "$" + b.length.toString() + "$" + b64.toString();
                        return res;

Возвращает длину 1851, а файл из Base64 получается 1875. Что за чушь?
На всякий случай прилагаю файлы - txt - возврат из CallFunction, b64 - вырезанный из ответа, а PNG - декодированный b64.

abb 08.06.2016 21:57

В общем проблема действительно была в Base64Encoder.
После вставки
Код AS3:

b64.insertNewLines = false;

все стало декодироваться корректно.


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

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