Uploaded image for project: 'Apache Flex'
  1. Apache Flex
  2. FLEX-35370

TLF - Import and export base64 string image

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Open
    • Major
    • Resolution: Unresolved
    • Apache Flex 4.16.0
    • None
    • TLF
    • None
    • Flex + AIR + Text Layout Framework
    • Patch, Important

    Description

      TLF is a powerful framework however have a gap on a good image support or it's incompleted.

      The developer can set a Sprite with bitmap data but when try to export the image source is exported as [Sprite object] and of course can't be restored by import.

      I fixed this issue on my side, patching the original TLF export and import and I want to donate my patch to Apache Flex community.

      In the method exportImage of the class TextLayoutExporter, replace:

      if (image.source != null)
         output.@source = image.source;
      

      By:

      if (image.source != null)
      {
      	if (image.source is Sprite)
      	{
      		var sprite:Sprite = image.source as Sprite;
      		var bitmapData:BitmapData = new BitmapData(image.measuredWidth, image.measuredHeight, true, 0x00FFFFFF);
      		bitmapData.draw(sprite);
      
      		var pngEncoder:PNGEncoder = new PNGEncoder();
      		var base64Encoder:Base64Encoder = new Base64Encoder();
      		base64Encoder.encodeBytes(pngEncoder.encode(bitmapData));
      		output.@source = "data:image/png;base64," + base64Encoder.toString();
      	}
      	else
      	{
      		output.@source = image.source;
      	}
      }
      

      And in the method createInlineGraphicFromXML of the class TextLayoutImporter, replace by this version:

      public function createInlineGraphicFromXML(xmlToParse:XML):InlineGraphicElement
      {				
      	var imgElem:InlineGraphicElement = new InlineGraphicElement();
      	
      	parseStandardFlowElementAttributes(imgElem,xmlToParse,_ilgElementFormatImporters);
      	
      	if (_ilgFormatImporter.result)
      	{
      		var source:String = _ilgFormatImporter.result["source"];
      		if (source != null && source.substr(0, "data:image/png;base64,".length) == "data:image/png;base64,")
      		{
      			var base64Decoder:Base64Decoder = new Base64Decoder();
      			base64Decoder.decode(source.substr("data:image/png;base64,".length));
      
      			var bitmapData:BitmapData = new PNGDecoder().decode(base64Decoder.toByteArray());
      
      			var image:Sprite = new Sprite();
      			image.graphics.beginBitmapFill(bitmapData, null, true, true);
      			image.graphics.drawRect(0, 0, bitmapData.width, bitmapData.height);
      			image.graphics.endFill();
      			imgElem.source = image;
      		}
      		else
      		{
      			imgElem.source = _imageSourceResolveFunction != null ? _imageSourceResolveFunction(source) : source;
      		}
      
      		// if not defined then let InlineGraphic set its own default
      		imgElem.height = _ilgFormatImporter.result["height"];
      		imgElem.width  = _ilgFormatImporter.result["width"];
      		/*	We don't support rotation yet because of bugs in the player. */		
      		// imgElem.rotation  = InlineGraphicElement.heightPropertyDefinition.setHelper(imgElem.rotation,_ilgFormatImporter.result["rotation"]);
      		imgElem.float = _ilgFormatImporter.result["float"];
      	}
      
      	return imgElem;
      }
      

      The only issue about this solution is that this import method relies on the third party PNGDecoder from this source: https://forum.starling-framework.org/topic/how-to-load-a-png-file-as-texture-with-a-sync-way because I needed to load the image synchronously, so the Apache Flex have several options: 1. use the case as it is, if possible; 2. create their own version; 3. adapt the code, so that can be compatible with async way.

      Attachments

        Activity

          People

            Unassigned Unassigned
            hferreira.80@gmail.com Hugo Ferreira
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated: