Как сохранить BitmapData в файл Bitmap * .bmp или гораздо более быстрый метод кодирования JPE - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть настольное приложение на основе Flash / Actionscript 3, упакованное в * .exe с использованием Zinc 4.0.Я использую Flash Pro CS5.

Мне нужно начать локально сохранять очень большие файлы изображений.Я возился с JPG-кодированием этих изображений, прежде чем сохранять их в локальном файле через Zinc.Я решил проблему тайм-аута Actionscirpt, используя Этот метод "asyncronous like" .Кодирование 1,5 Мп изображения занимает около 5 секунд, что нормально, но кодирование 8 Мп файла изображения занимает около 40 секунд, что недопустимо.

У меня была одна идея - сохранить BitmapData локально во временный файл Bitmap (* .bmp), не заставляя конечного пользователя ждать JPG-кодировку во Flash, а затем использовать уже существующий процессор изображений (написанныйв C #), чтобы прочитать файл растрового изображения и кодировать его, не дожидаясь, пока Flash сделает это, эффективно выгружая задачу от пользователя.

Я использовал BitmapData.getPixels () , чтобы попробоватьи записать байтовый массив непосредственно в файл, используя тот же метод Zinc, который я успешно использую с закодированными JPG, но файл * .bmp не читается.Есть ли какие-нибудь заголовки файлов, которые нужно было бы добавить в дополнение к байтовому массиву BitmapData getPixel (), чтобы успешно сохранить растровое изображение?Если да, то как я могу успешно добавить их в байтовый массив перед записью в файл?

Любые рекомендации, разъяснения или другие решения приветствуются.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2012

Я нашел решение для своих нужд, и на тот случай, если у других есть аналогичные потребности:

Чтобы сохранить фактический файл растрового изображения (* .bmp), инженер предложил Класс кодировщика Btimap было круто.Очень быстро на фактическое кодирование;однако, поскольку мой вызов записи файлов в Zinc является синхронным, а растровые файлы намного больше, чем JPG, он просто переместил мою бутылочную горловину с кодирования на сохранение файла, поэтому я решил поискать в другом месте.Если бы у Zinc был асинхронный метод записи двоичных файлов, который не блокировал бы графический интерфейс, я был бы счастлив, но до тех пор это не было для меня решением.

Я наткнулся на решение Flash Alchemy, с отличными результатами,Вместо того чтобы ждать 40 секунд для кодирования 8-мегапиксельного изображения, теперь это занимает всего несколько секунд.Вот что я сделал:

  1. Скачал jpegencoder.swc с этой страницы и сохранил его в каталоге моего проекта
  2. Добавил swc: Настройки публикации> Flash(вкладка)> Скрипт: Actionscript 3.0 Кнопка «Настройки ...»> Путь к библиотеке (вкладка)> и добавил, что .swc с Link Type = «Объединено в код»
  3. Затем использовал его:

(ниже приведен мой модифицированный код, содержащий только основы)

import flash.utils.ByteArray;
import flash.display.BitmapData;
import cmodule.aircall.CLibInit; //Important: This namespace changed from previous versions

var byteArrayResults:ByteArray; //Holds the encoded byte array results

public static function startEncoding(bitmapData:BitmapData):void {

    var jpeginit:CLibInit = new CLibInit();     // get library
    var jpeglib:Object = jpeginit.init();       // initialize library exported class to an object

    var imageBA:ByteArray = bitmapData.getPixels(bitmapData.rect);  //Getpixels of bitmapData
    byteArrayResults = new ByteArray();
    imageBA.position = 0;
    jpeglib.encodeAsync(encodeComplete, imageBA, byteArrayResults, bitmapData.width, bitmapData.height, 80);
}

private static function encodeComplete(thing:*):void
{
    // Do stuff with byteArrayResults
}

Вы также можете найти эту ссылку полезной: http://last.instinct.se/graphics-and-effects/using-the-fast-asynchronous-alchemy-jpeg-encoder-in-flash/640

1 голос
/ 14 мая 2014

мой ответ опоздал, но Мэйби помогает. Я разработал мобильное приложение AIR для сохранения изображений с камеры устройства на устройстве и загрузки их на сервер. начиная с Air 3.3, у вас есть эта функция кодирования битовых данных:

var ba:ByteArray = new ByteArray();
var bd:BitmapData = new BitmapData(_lastCameraPhotoTmpBmp.width, _lastCameraPhotoTmpBmp.height);
bd.draw(_lastCameraPhotoTmpBmp);
bd.encode(new Rectangle(0, 0, 1024, 768), new JPEGEncoderOptions(80), ba);

var localFile:File = File.applicationStorageDirectory.resolvePath("bild.jpg");
var fileAccess:FileStream = new FileStream();
fileAccess.open(localFile, FileMode.WRITE);
fileAccess.writeBytes(ba, 0, ba.length);
fileAccess.close();

кодирование в jpg в моих тестах занимает ~ 100 мс на мобильных устройствах.

привет, Стефан

...