web-dev-qa-db-fra.com

Python: comment redimensionner une image raster avec PyQt

J'ai besoin de trouver un moyen de redimensionner une image raster en entrée (telle que jpg) à une résolution largeur/hauteur spécifiée (donnée en pixels). Ce serait formidable si PyQt, tout en redimensionnant une nouvelle image, gardait le rapport d'aspect de l'image d'origine (il n'y a donc pas d'étirement mais de mise à l'échelle uniquement).

src = '/Users/usrName/Images/originalImage.jpg' (2048x1024) (image rectangulaire 2: 1 ratio) dest = '/Users/usrName/Images/originalImage_thumb.jpg' (64x64) (l'image de sortie est le carré 1: 1 rapport).

Merci d'avance!

FONC RÉSULTÉ AFFICHÉ:

... pourrait être utilisé pour redimensionner et convertir une image dans n'importe quel format pris en charge par QT jusqu'à présent ... tels que: 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pbm', 'tiff', 'svg', 'xbm'

def resizeImageWithQT(src, dest):
    pixmap = QtGui.QPixmap(src)
    pixmap_resized = pixmap.scaled(720, 405, QtCore.Qt.KeepAspectRatio)
    if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest))
    pixmap_resized.save(dest)
13
alphanumeric

Créez un pixmap:

    pixmap = QtGui.QPixmap(path)

puis utilisez QPixmap.scaledToWidth ou QPixmap.scaledToHeight :

    pixmap2 = pixmap.scaledToWidth(64)
    pixmap3 = pixmap.scaledToHeight(64)

Avec une image 2048x1024, la première méthode aboutirait à une image qui est 64x32, tandis que la seconde serait 128x64. Évidemment, il est impossible de redimensionner une image 2048x1024 en 64x64 tout en conservant le même rapport hauteur/largeur (car les rapports sont différents).

Pour éviter de choisir entre largeur ou hauteur, vous pouvez utiliser QPixmap.scaled :

    pixmap4 = pixmap.scaled(64, 64, QtCore.Qt.KeepAspectRatio)

qui s'ajustera automatiquement à la plus grande taille possible.

Pour redimensionner l'image à une taille exacte, procédez comme suit:

    pixmap5 = pixmap.scaled(64, 64)

Bien sûr, dans ce cas, l'image résultante ne conservera pas le même rapport d'aspect, sauf si l'image d'origine était également 1: 1.

30
ekhumoro