2017-07-26 2 views
2

Für nachfolgende Verarbeitungszwecke, in Python Ich bin Umwandlung einer mehrseitigen PDF (f) in JPEGs (temp?.jpg):Python maximale Dateigröße beim Konvertieren (PDF) in JPEG unter Verwendung z. Stab

import os 
from wand.image import Image as wimage 

with wimage(filename=f,resolution=300) as img: 
    for i in range(len(img.sequence)): 
     ftemp=os.path.abspath('temp%i.jpg'%i) 
     img_to_save=wimage(img.sequence[i]) 
     img_to_save.compression_quality = 100 
     img_to_save.format='jpeg' 
     img_to_save.save(filename=ftemp) 

Ich wand verwende wegen seiner Fähigkeit, die PDF-Seiten zu sequenzieren, aber bin offen für PIL usw.

Ich brauche die resolution und compression_quality, um so hoch wie möglich zu sein, aber ich möchte jedes JPEG nicht größer als (sagen wir) 300 kb groß sein.

Wie kann ich die Größe der JPEG-Datei begrenzen?

Auf der Kommandozeile würde ich nur tun (siehe https://stackoverflow.com/a/11920384/1021819):

convert original.jpeg -define jpeg:extent=300kb -scale 50% output.jpg 

Dank!

Antwort

1

Die -Bibliothek verfügt über wand.image.OptionDict für die Verwaltung von -define Attribute, aber leider sind alle Optionen durch wand.image.Option fixedset gesperrt. IMHO, dies macht die gesamte Funktion als unbrauchbar.

Glücklicherweise können Sie eine schnelle Unterklasse erstellen, um dies über die wand.api zu behandeln.

import os 
from wand.image import Image 
from wand.api import library 
from wand.compat import binary 

class wimage(Image): 
    def myDefine(self, key, value): 
     """ Skip over wand.image.Image.option """ 
     return library.MagickSetOption(self.wand, binary(key), binary(value)) 


with wimage(filename=f, resolution=300) as img: 
    for i in range(len(img.sequence)): 
     ftemp=os.path.abspath('temp%i.jpg'%i) 
     with wimage(img.sequence[i]) as img_to_save: 
      img_to_save.myDefine('jpeg:extent', '300kb') 
      img_to_save.compression_quality = 100 
      img_to_save.format='jpeg' 
      img_to_save.save(filename=ftemp) 

In naher Zukunft. Die wand.image.Option wäre veraltet, und Sie könnten einfach img_to_save.options['jpeg:extent'] = '300kb' anrufen.

+0

Spot auf - danke so sehr! – jtlz2

Verwandte Themen