windows - Montage ved hjælp af PythonMagick i Python 3?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg håbede at kunne generere montage ved hjælp af PythonMagick. Dokumentationen virker meget sparsom, men jeg har forsøgt at jagte den ned ved hjælp af kodens færdiggørelsesdel af Eclipse i det mindste, samt et par andre spørgsmål 'forslag her om Stack Overflow. Det ser ud til, at MagickWand API har den funktion, jeg leder efter, i henhold til dette:


http://www.imagemagick.org/api/MagickWand/montage\_8c.html[3]


Jeg kan imidlertid ikke synes at finde den i PythonMagick. Er dette simpelthen utilgængeligt? Hvis det er tilfældet, kan jeg bare grøfte resten af ​​min PythonMagick-kode og stole på subprocess.call på en bærbar ImageMagick-distribution eller sådan noget (dette program skal være bærbart og køre på Windows med en nem port til Mac OS ... hidtil har jeg nogle få andre PythonMagick-kommandoer, der fungerer, så jeg vil gerne holde denne rute gå, hvis det er muligt).


Tak!

Bedste reference


Ved hjælp af python imagemagick/graphicsmagick hjælper bindinger meget, men desværre er ikke alle funktionaliteterne der endnu. Jeg havde faktisk det samme problem med @FizxMike. Jeg havde brug for at bruge montage og derefter lave nogle yderligere operationer, men gemme filen på harddisken og derefter genindlæse den i en ordentlig pgmagick-objekt for at gøre resten af ​​operationerne og gemme den igen var langsom.


Til sidst brugte jeg subprocess-løsningen, men i stedet for at gemme i en fil, omdirigerer jeg output i stdout. Derefter bruger jeg stdout'en til at indlæse billedet fra en pgmagick.Blob i et pgmagick.Image-objekt og gøre resten af ​​behandlingen i python-kode.


Proceduren ser sådan ud i koden:


import os
import pgmagick
import subprocess

my\_files = []
# Dir with the images that you want to operate on
dir\_with\_images = "."
for file in os.listdir(dir\_with\_images):
    if file.endswith(".png"):
        my\_files.append(os.path.join(dir\_with\_images, file))

montage\_cmd = ['gm', 'montage']
montage\_cmd.extend(my\_files)
# The trick is in the next line of code. Instead of saving in a file, e.g. myimage.png
# the montaged file will just be "printed" in the stdout with 'png:-'
montage\_cmd.extend(['-tile', '2x2', '-background', 'none', '-geometry', '+0+0', 'png:-'])

# Use the command line 'gm montage' since there are not python bindings for it :(
p = subprocess.Popen(montage\_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# Get the stdout in a variable
stdout, stderr = p.communicate()

# Load the stdout in a python pgmagick Image object using the pgmagick.Blob
# and do the rest of the editing on python code
img = pgmagick.Image(pgmagick.Blob(stdout))
# Display the image
img.display()
geometry = pgmagick.Geometry(300, 200)
geometry.aspect(True)
# Resize the montaged image to 300x200, but keep the aspect ratio
img.scale(geometry)
# Display it again
img.display()
# And finally save it <- Only once disk access at this point.
img.write('myimage.png')

Andre referencer 1


Jeg har det samme problem, selv pgmagick mangler funktionen montageImage () (Magick ++ montage eksempel) [4] [5]


Dette er hvad jeg gør (i en Django View):


#ImageMagick CLI is better documented anyway (-background none preserves transparency)
subprocess.call("montage -border 0 -geometry "+str(cols)+"x -tile 1x"+str(len(pages))+" "+target\_path[0:len(target\_path)-4]+"[0-9]*.png -background none "+target\_path,shell=True)`


Ikke sjovt, fordi jeg skal jonglere rundt om en masse filer først ... at skrive til harddisk er ikke den hurtigste ting at gøre, og derefter slette temp-filerne.


Jeg ville meget hellere gøre alt i ram.


Jeg er stadig på jagt efter et bedre svar selv.