【问题标题】:bitmapData to base64 and then to html tag img with src containing base64 encoded databitmapData 到 base64,然后到 html 标记 img 与 src 包含 base64 编码数据
【发布时间】:2014-09-13 17:15:20
【问题描述】:

我正在尝试从我的摄像头获取快照。我有这部分代码(as3)用于快照

        private static const encodeChars:Array = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/'];

        private function snap():String{
                var bitmapData:BitmapData = new BitmapData(myVideo.width, myVideo.height);
                bitmapData.draw(myVideo);
                return encodeByteArray(bitmapData);
        }

        public static function encodeByteArray(data:BitmapData):String{  
                    if(data == null)throw new Error("data parameter can not be empty!");  
                    var bytes:ByteArray = data.getPixels(data.rect);  
                    bytes.writeShort(data.width);  
                    bytes.writeShort(data.height);  
                    bytes.writeBoolean(data.transparent);  
                    bytes.compress(); 
                    var out:Array = [];
                    var i:int = 0;
                    var j:int = 0;
                    var r:int = bytes.length % 3;
                    var len:int = bytes.length - r;
                    var c:int;
                    while (i < len) {
                        c = bytes[i++] << 16 | bytes[i++] << 8 | bytes[i++];
                        out[j++] = encodeChars[c >> 18] + encodeChars[c >> 12 & 0x3f] + encodeChars[c >> 6 & 0x3f] + encodeChars[c & 0x3f];
                    }
                    if (r == 1) {
                        c = bytes[i++];
                        out[j++] = encodeChars[c >> 2] + encodeChars[(c & 0x03) << 4] + "==";
                    }
                    else if (r == 2) {
                        c = bytes[i++] << 8 | bytes[i++];
                        out[j++] = encodeChars[c >> 10] + encodeChars[c >> 4 & 0x3f] + encodeChars[(c & 0x0f) << 2] + "=";
                    }
                    return out.join('');
        }

在我从 js 调用它之后,我在我的 html 中创建了一个 img 标记,并将接收到的数据粘贴到 img 的 src 属性中,之前带有字符串“data:image/jpeg;base64”。但是我的浏览器图标坏了。我做错了什么以及如何使用我的 cam 中的 base64 编码数据创建图像?

感谢您的帮助!

【问题讨论】:

  • 你能发布你的encodeChars吗?
  • 是的,我刚刚把它们放在了问题中

标签: image actionscript-3 actionscript base64


【解决方案1】:

我认为问题在于您最初从 BitmapData 创建 ByteArray 的方式。 Flash自带编码,建议大家使用:

public static function encodeByteArray(data:BitmapData):String{  
    if(data == null)throw new Error("data parameter can not be empty!");  
    var bytes:ByteArray = data.encode(data.rect, new JPEGEncoderOptions(100));  //100 is the JPG quality
    var out:Array = [];
    var i:int = 0;
    var j:int = 0;
    var r:int = bytes.length % 3;
    var len:int = bytes.length - r;
    var c:int;
    while (i < len) {
        c = bytes[i++] << 16 | bytes[i++] << 8 | bytes[i++];
        out[j++] = encodeChars[c >> 18] + encodeChars[c >> 12 & 0x3f] + encodeChars[c >> 6 & 0x3f] + encodeChars[c & 0x3f];
    }
    if (r == 1) {
        c = bytes[i++];
        out[j++] = encodeChars[c >> 2] + encodeChars[(c & 0x03) << 4] + "==";
    }
    else if (r == 2) {
        c = bytes[i++] << 8 | bytes[i++];
        out[j++] = encodeChars[c >> 10] + encodeChars[c >> 4 & 0x3f] + encodeChars[(c & 0x0f) << 2] + "=";
    }
    return out.join('');
}

【讨论】:

  • 您可以通过将encodeByteArray 的结果粘贴到此处找到的解码器中来测试您的结果:askapache.com/online-tools/base64-image-converter
  • 我尝试使用您的部分代码,但出现两个错误 (1046):错误:调用可能未定义的方法,通过静态类型的引用进行编码 flash.display:BitmapData 和(1046):错误:调用可能未定义的方法 JPEGEncoderOptions。
  • 您的目标是什么版本的 FlashPlayer? BitmapData.encodeJPEGEncoderOptions 仅适用于 11.3 及更高版本。
  • 我做了和这里stackoverflow.com/questions/13363557/…说的一样的事,但似乎没有任何效果
  • 该页面上描述的方法应该可以解决问题。您是否仍然遇到同样的错误?
【解决方案2】:

您可以尝试这样做...

首先,您需要获取Base64 SWC here(右键单击并保存红色文本,然后返回此处)。如果您在安装 SWC 时需要帮助,可以查看我的另一个 answer here。 (如果您还没有安装 AS3 JPEG 编码器,您还需要那里提到的 AS3 Corelib。AS3 Corelib 负责从您的原始位图数据编码真正的 JPG 或 PNG 图像)

在代码中:您需要 public 变量来存储图像数据字节和字符串,并在快照函数和 base64 编码函数等之间更新它们。所以在这个示例代码中 actual_IMG 是实际图像数据(带有 jpeg 标头)准备好 base64 或只是使用fileReference 将常规 .jpg 保存到磁盘。

public var actual_IMG:ByteArray = new ByteArray;
public var image_B64_str:String = new String;

private function snap():void
{
    var bitmapData:BitmapData = new BitmapData(myVideo.width, myVideo.height);
    bitmapData.draw(myVideo);

    var jpg_Quality:int= 100;
    var jpgEncoder:JPGEncoder = new JPGEncoder(jpg_Quality);  

    actual_IMG = jpgEncoder.encode(bitmapData);
    encode_Image(); //do base64 encode function

}

private function encode_Image():void
{
    image_B64_str = Base64.encode(actual_IMG); //update string with b64 data
    doSomeFunction(); //do whatever is needed with.. image_B64_str (JPG string)
}

private function doSomeFunction():void
{
    //example: send "image_B64_str" to Javascript or save to disk etc etc...
}

希望对你有帮助..

直接链接更新:

【讨论】:

  • PS:如果您确实使用该 SWC,请确保您没有导入另一个 Base64 编码器类以避免任何编译器错误
  • 你看不出答案中的一些文字也是链接吗?它们是蓝色的,当您将鼠标悬停在它们上面时会加下划线...“Base64 SWC here”链接到 SWC..“请参阅我的 answer here”有 JPG/PNG 编码器的链接并提供设置说明..我会无论如何都要更新答案
猜你喜欢
  • 1970-01-01
  • 2016-01-08
  • 2015-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-19
  • 1970-01-01
  • 2018-10-31
相关资源
最近更新 更多