Question

I have bitmapdata object converted to bytearray:

var bytes:ByteArray = bitmapDataA.getPixels(bitmapDataA.rect);

and I save it as .jpg file for later:

writeStream.writeBytes(bytes, 0, bytes.bytesAvailable);

Now, when I want to retrieve the data:

var file:File = File.documentsDirectory.resolvePath("data/"+photoNameVec[loadCounter]);         
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.READ);
var fileContent:ByteArray = new ByteArray;
fileStream.readBytes(fileContent);
fileStream.close();         
var bmpData:BitmapData = new BitmapData(XXX, YYY);
bmpData.setPixels(bmpData.rect, fileContent);
addChild(new Bitmap(bmpData));

But I need to get exact XXX and YYY to show the graphics correctly. How can I do this?

EDIT:

As there was no way to determine bitmapdata width and height based on bytearray, I decided to transform all pictures I take to 1024px x 768px:

var bitmapDataA:BitmapData = new BitmapData(mpLoaderInfo.width, mpLoaderInfo.height);
var matrix:Matrix = new Matrix();
matrix.scale( 1024 / mpLoaderInfo.width, 768 / mpLoaderInfo.height);
var bitmapDataB:BitmapData = new BitmapData(1024,768);
bitmapDataB.draw(mpLoaderInfo.content, matrix, null, null, new Rectangle(0,0,1024,768), true);

Still waiting for tips on getting Width x Height from bytearray created by getPixels method of bitmapdata.

Was it helpful?

Solution 2

I guess that's the most suiting solution :) Simply expand the the bytearray with extra values from which I shall gather width and height.

http://www.ghostwire.com/blog/archives/as3-serializing-bitmaps-storing-bitmapdata-as-raw-binarybytearray/

Ps.: Creating and reading uncompressed files is way faster than making png/jpg

OTHER TIPS

You can use a Loader class to load the image then you can access it's width/height and BitmapData

var file:File = File.documentsDirectory.resolvePath("data/"+photoNameVec[loadCounter]);
var myImage:BitmapData;

var loader:Loader = new Loader();
var urlReq:URLRequest = new URLRequest(file.url);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaded);
loader.load(urlReq);

function loaded(e:Event):void
{
    var bmp:Bitmap = e.target.content as Bitmap;
    myImage = bmp.bitmapData;
    trace(myImage.width, myImage.height);
}

And here is with loadBytes

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT, loaded);
loader.loadBytes(yourByteArray);

function loaded(e:Event):void
{
    var bmp:Bitmap = e.target.content as Bitmap;
    myImage = bmp.bitmapData;
    trace(myImage.width, myImage.height);
}

The byte array created by getPixels does not contain any information on the height or width of the bitmap, it's simply an "unsigned integer (a 32-bit unmultiplied pixel value) for each pixel".

So you'll need to either write it as an image format (PNG/JPG) which will require encoding (hence time), or simply add the width and height to your byte array before writing to file.

Eg in your stream writer:

writeStream.writeInt( bitmapDataA.width );
writeStream.writeInt( bitmapDataA.height );
writeStream.writeBytes(bytes, 0, bytes.bytesAvailable);

Then when you are loading:

var file:File = File.documentsDirectory.resolvePath("data/"+photoNameVec[loadCounter]);         
var fileStream:FileStream = new FileStream();
fileStream.open(file, FileMode.READ);

var w:int = fileStream.readInt();
var h:int = fileStream.readInt();

var fileContent:ByteArray = new ByteArray;
fileStream.readBytes(fileContent);
fileStream.close();         

var bmpData:BitmapData = new BitmapData( w , h);

bmpData.setPixels(bmpData.rect, fileContent);
addChild(new Bitmap(bmpData));
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top