Конвертировать PNG-изображение в BLOB-изображение с помощью JavaScript?

1

Я не могу показать свой тег изображения, сгенерированный тегом canvas, который содержит двоичные данные png. Я хочу, чтобы иметь возможность отображать это новое изображение в редакторе TinyMCE, поэтому я могу редактировать его с помощью плагина FMath.

Изображение 174551

Когда я нахожу над тегом img, который пуст, я получаю сообщение об ошибке "Не удалось загрузить данный URL".

Изображение внизу - мой тег canvas, содержащий данные png. Мне нужно каким-то образом передать эти данные png в img-тег с адресом blob, чтобы я мог редактировать его с помощью редактора FMath:

Изображение 174551

Код, который я использую, следующий:

var tinymceapp = (function (jq, tmce) {'use strict';
    var canvas = null,
        ctx = null,
        base64String = "",
        img = null,
        blob = null;

    return {
        pageReady: function () {
            tmce.init({
                selector: '#editor',
                height: 500,
                theme: 'modern',
                plugins: [
                    'other plugins FMathEditor'
                ],
                toolbar1: 'toolbar 1 buttons',
                toolbar2: 'toolbar 2 buttons | FMathEditor',

                init_instance_callback : function(editor) {
                    img = new Image();
                    canvas = document.getElementById('canvas');
                    ctx = canvas.getContext('2d');

                    img.onload = function () {
                       canvas.width = this.width;
                       canvas.height = this.height;
                       ctx.drawImage(img, 0, 0);
                    };

                    img.src = 'img/math.png';

                    base64String = canvas.toDataURL('image/png', 1.0);

                    blob = canvas.toBlob(function (blob) {
                        var newImg = document.createElement('img'),
                        url = window.URL.createObjectURL(blob);
                        console.log(url);
                        newImg.onload = function() {
                            // no longer need to read the blob so it revoked
                            window.URL.revokeObjectURL(url);
                        };

                        newImg.src = url;
                        document.body.appendChild(newImg);
                    }, 'image/png', 1.0);

                    tmce.activeEditor.insertContent('<img alt="MathML (base64):' + base64String.substring(22, base64String.length) + '" src="' + base64String + '"/>');

                }
            });
        }
    };
}($, tinymce));

$(document).ready(tinymceapp.pageReady);

Я пробовал оба подхода с Canvas.toDataUrl() и с Canvas.toBlob(). Но оба создают пустой образ.

Что я делаю неправильно? Есть идеи?

На приведенном ниже рисунке показано генерирование тега img с помощью кода toBlob():

Изображение 174551

Это пример img-тега, который не может быть отображен:

<img src="blob:http://localhost:8081/9fd2d43d-3b7f-42cd-a50d-161263d70c55" alt="MathML (base64):iVBORw0KGgoAAAANSUhEUgAAASwAAACWCAYAAABkW7XSAAAAxUlEQVR4nO3BMQEAAADCoPVPbQhfoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOA1v9QAATX68/0AAAAASUVORK5CYII=" data-mce-selected="1">

Это нижний пустой тег img, созданный canvas.toBlob():

<img src="blob:http://localhost:8081/eede9470-3728-4031-8c58-9c29a4c8979f">
Теги:
base64
image
canvas
tinymce

1 ответ

0
Лучший ответ

Вы пытаетесь получить blob, пока загрузка изображения еще не завершена. В основном вам нужно подождать, пока загрузится изображение, прежде чем вы сможете выполнить захват blob (async).

Итак, вот на этом шаге:

img.onload = function () {
   canvas.width = this.width;
   canvas.height = this.height;
   ctx.drawImage(img, 0, 0);
   // YOU SHOULD PROCESS / CALLBACK IT HERE
};
// HERE IS WHERE YOU DO IT AS OF NOW

Ещё вопросы

Сообщество Overcoder
Наверх
Меню