Как установить цвет фона при рендеринге PNG с использованием PythonMagick - PullRequest
21 голосов
/ 27 апреля 2011

Я пытаюсь визуализировать SVG-> PNG, используя PythonMagick, но кажется, что цвет фона игнорируется.

С помощью команды ImageMagick все работает как положено:

tmp$ convert -background none access.svg access.png
tmp$ convert -background red access.svg access2.png

, что приводит к прозрачному и красному фону соответственно.

Но при использовании PythonMagick кажется, что цвет фона игнорируется:

import PythonMagick
svg = PythonMagick.Image('access.svg')
svg.backgroundColor().to_std_string()
'#FFFFFFFFFFFF'
svg.backgroundColor().alpha()
0.0
svg.backgroundColor('none')
svg.backgroundColor().to_std_string()
'#0000000000000000'
svg.backgroundColor().alpha()
1.0
svg.write('access.png')
svg.backgroundColor('red')
svg.backgroundColor().to_std_string()
'#FFFF00000000'
svg.backgroundColor().alpha()
0.0
svg.write('access2.png')

Проверка вывода показывает, что оба PNG имеют белый фон. Есть ли другой способ установить цвет фона, чтобы он распознавался при записи изображения?

Ответы [ 6 ]

1 голос
/ 09 мая 2012

ImageMagick (и PythonMagick как его Python API) очень плохо поддерживают SVG.Даже не ожидайте, что он будет отображать файл SVG, как написано в спецификации SVG.Он конвертирует SVG во внутренний язык MVG, а затем конвертирует в PNG.См. http://www.imagemagick.org/script/magick-vector-graphics.php

ImageMagick не является инструментом для манипулирования векторной графикой.

0 голосов
/ 19 апреля 2013

В Imagick для PHP вы можете перейти:

$im->setBackgroundColor(new ImagickPixel('transparent'));

Где $ im - это ваш вновь созданный объект Imagick без загрузки на него ничего.

Надеюсь, это поможет.

0 голосов
/ 02 мая 2012

Здесь сказано, что по умолчанию цвет фона белый, поэтому кажется, что он его не получает: http://www.imagemagick.org/script/command-line-options.php#background

Возможно, вам нужно установить канал на 'RGBA', возможно, по умолчанию это RGB, однакокажется, что фон должен быть правильного цвета, если так.Как это делают многие примеры заливки: http://www.imagemagick.org/Usage/masking/#floodfill

Вот вывод объекта:

['class', 'delattr', 'dict', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'instance_size', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'adaptiveThreshold', 'addNoise', 'adjoin', 'affineTransform', 'animationDelay', 'animationIterations', 'annotate', 'antiAlias', 'attribute', 'backgroundColor', 'backgroundTexture', 'baseColumns', 'baseFilename', 'baseRows', 'blur', 'border', 'borderColor', 'boundingBox', 'boxColor', 'cacheThreshold', 'channel', 'channelDepth', 'charcoal', 'chop', 'chromaBluePrimary', 'chromaGreenPrimary', 'chromaRedPrimary', 'chromaWhitePoint', 'classType', 'clipMask', 'colorFuzz', 'colorMap', 'colorMapSize', 'colorSpace', 'colorize', 'columns', 'comment', 'compare', 'compose', 'composite', 'compressType', 'contrast', 'convolve', 'crop', 'cycleColormap', 'debug', 'defineSet', 'defineValue', 'density', 'depth', 'despeckle', 'directory', 'display', 'draw', 'edge', 'emboss', 'endian', 'enhance', 'equalize', 'erase', 'fileName', 'fileSize', 'fillColor', 'fillPattern', 'fillRule', 'filterType', 'flip', 'floodFillColor', 'floodFillOpacity', 'floodFillTexture', 'flop', 'font', 'fontPointsize', 'fontTypeMetrics', 'format', 'frame', 'gamma', 'gaussianBlur', 'geometry', 'gifDisposeMethod', 'iccColorProfile', 'implode', 'interlaceType', 'iptcProfile', 'isValid', 'label', 'lineWidth', 'magick', 'magnify', 'map', 'matte', 'matteColor', 'matteFloodfill', 'meanErrorPerPixel', 'medianFilter', 'minify', 'modifyImage', 'modulate', 'modulusDepth', 'monochrome', 'montageGeometry', 'negate', 'normalize', 'normalizedMaxError', 'normalizedMeanError', 'oilPaint', 'opacity', 'opaque', 'page', 'penColor', 'penTexture', 'ping', 'pixelColor', 'process', 'profile', 'quality', 'quantize', 'quantizeColorSpace', 'quantizeColors', 'quantizeDither', 'quantizeTreeDepth', 'raise', 'read', 'readPixels', 'reduceNoise', 'registerId', 'renderingIntent', 'resolutionUnits', 'roll', 'rotate', 'rows', 'sample', 'scale', 'scene', 'segment', 'shade', 'sharpen', 'shave', 'shear', 'signature', 'size', 'solarize', 'spread', 'statistics', 'stegano', 'stereo', 'strokeAntiAlias', 'strokeColor', 'strokeDashOffset', 'strokeLineCap', 'strokeLineJoin', 'strokeMiterLimit', 'strokePattern', 'strokeWidth', 'subImage', 'subRange', 'swirl', 'syncPixels', 'textEncoding', 'texture', 'threshold', 'throwImageException', 'tileName', 'totalColors', 'transform', 'transformOrigin', 'transformReset', 'transformRotation', 'transformScale', 'transformSkewX', 'transformSkewY', 'transparent', 'trim', 'type', 'unregisterId', 'unsharpmask', 'verbose', 'view', 'wave', 'write', 'writePixels', 'x11Display', 'xResolution', 'yResolution', 'zoom']

Здесь: Документы и примеры PythonMagick ,Вы можете увидеть канал там.

0 голосов
/ 21 апреля 2012

PythonMagick плохо документирован (для благотворительности), поэтому вы можете захотеть придерживаться того, что имеет лучшую документацию, например PythonMagickWand .В общем, я рекомендую придерживаться Python Imaging Library , но она не поддерживает SVG, поэтому она не будет работать для вас.

Я думаю, что не так с вашим кодом, когдаВы изменяете изображение, возможно, вы создаете новое изображение, даже если вы видите изменения в объекте, на который сохраняете ссылку.Так что попробуйте

svg = svg.backgroundColor('none')
svg.write('access.png')
svg = svg.backgroundColor('red')
svg.write('access2.png')
0 голосов
/ 21 марта 2012

Это может быть обходной путь к решению, но не могли бы вы создать отдельное фоновое изображение нужного вам цвета и затем скомпоновать изображения вместе?

Думаю, это будет выглядеть примерно так:

image.composite(background, 0, 0, PythonMagick.CompositeOperator.SrcOverDst)

У меня очень мало опыта работы с PythonMagick, но это то, что я бы попробовал, не сумев установить фон.

Источники:

0 голосов
/ 04 июня 2011

Я не вижу проблемы, если она работает с командой, тогда используйте это:

image = 'convert -background red access.svg access.png'
os.system(image)

И не забудьте импортировать os

import os

дополнительно, вы можете использовать varsвнутри команды (не забудьте переименовать переменные):

image = 'convert -background '+background+' '+file_from+' '+file_to
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...