@mrkovalchuk
Junior developer

Почему изображение сохраняется черно-белым?

Добрый день.

Не могу добавить цвета в изображение. Должно быть цветное, сохраняется черно-белое. Не могу придумать, от чего так.

JS код svg to png:
d3.select('#saveButton').on('click', function(){
            var svg = document.querySelector('svg');
            var svgString = getSVGString(svg);
	        svgString2Image( svgString, 2*dim.width, 2*dim.height, 'png');
        });

        // Below are the functions that handle actual exporting:
        // getSVGString ( svgNode ) and svgString2Image( svgString, width, height, format, callback )
        function getSVGString( svgNode ) {
            svgNode.setAttribute('xlink', 'http://www.w3.org/1999/xlink');

            var serializer = new XMLSerializer();
            var svgString = serializer.serializeToString(svgNode);
            svgString = svgString.replace(/(\w+)?:?xlink=/g, 'xmlns:xlink='); // Fix root xlink without namespace
            svgString = svgString.replace(/NS\d+:href/g, 'xlink:href'); // Safari NS namespace fix

            return svgString;

        }


        function svgString2Image( svgString, width, height, format, callback ) {
            var format = format ? format : 'png';
            var blob = new Blob([ svgString], { type: 'image/svg+xml' });
            var imgsrc = 'data:image/svg+xml;base64,'+ btoa( unescape( encodeURIComponent( svgString ) ) ); // Convert SVG string to data URL

            var url = window.URL.createObjectURL(blob);

            var image = new Image();


            var canvas = document.createElement("canvas");
            var context = canvas.getContext("2d");

            canvas.width = width;
            canvas.height = height;


            image.onload = function() {
                context.drawImage(image, 0, 0, width, height);
                var canvasUrl = canvas.toDataURL("image/png");
                canvas.remove();

                send_data(canvasUrl)
            };
            image.src =  url;

        }


Сохраняем изображение:
data = request.POST['img_data'][22:]
        data = base64.b64decode(data)
        # with open("imageToSave5.png", "wb") as fh:
        #    fh.write(data)
        # print(data)

        # data = data.encode()

        file = io.BytesIO(data)
        img = PIL.Image.open(file, 'r',)
        img.convert(mode='RGB', colors=256)
        img.save('test1.png')

        data = {'status': 'success'}

        return JsonResponse(data)


То, что хочу сохранить:
cb7e3c449f.jpg

То, как сохраняется:
bc33178272a5417c9a649b08b47eddf2.png
  • Вопрос задан
  • 1346 просмотров
Решения вопроса 1
trushka
@trushka
Скорее всего стили для svg, с цветами, прописаны где-то вне его (в библиотеке, рисующей график?), соответственно не сохраняются. Надо найти где они находятся и вставить в svg в тэг <style> Точнее, в svgString
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Вы не можете отправлять просто SVG? Для питона есть библиотека cairo для рендеринга SVG в PNG.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы