Перейти к содержимому

Как изменить размер изображения python

  • автор:

Используйте Python для операции Изменить размер изображения

Изменить размер изображения с помощью собственных Python приложений, используя библиотеку Aspose.Imaging

Применяйте операцию Изменить размер ко всем доступным форматам изображений

С помощью Aspose.Imaging вы можете изменять размер изображений или фотографий без потери визуальной информации. При корректировке размера изображения изменяется его файловый вес, что может привести к потере качества. Уменьшение размера изображений является основным способом для оперативной отправки по электронной почте или быстрой загрузки с Интернет сайта. При изменении размера растровых изображений создается новое изображение с меньшим или большим количеством пикселей, т.е. изображение масштабируется. Aspose.Imaging предоставляет различные алгоритмы изменения размера, что позволяет выбрать наиболее подходящий для конкретной задачи.

Используя библиотеку Aspose.Imaging для Python, вы можете легко выполнить операцию Изменить размер для изображений и фотографий различных форматов программно.

Меняем размер изображения в Python Pillow с обрезанием и изменением ширины и высоты

Изменение размера картинки в Python с Pillow (PIL) с resize() и crop() и другими методами

В Python есть много библиотек по работе с изображениями. Одна из самых известных библиотек — Pillow (ранее PIL). В этой статье будут рассмотрены примеры по изменению размеров картинки с помощью увеличения и уменьшения картинки, а так же обрезания.

Pillow не является стандартной библиотекой и устанавливается отдельно:

pip install pillow

Навигация по посту

  • Получение размеров
  • Изменение размера изображения с resize()
    • Учет соотношения сторон
    • Создание эскиза thumbnail
    • Создание границ изображения с ImageOps.expand

    Получение размеров

    Для получения размера картинки мы должны открыть ее (создать объект класса Image) и получить атрибут ‘size’. Это можно сделать так:

    from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # получаем ширину и высоту width, height = img.size print(width, height) # открываем картинку в окне img.show()

    Получение ширины и высоты картинки в Python Pillow

    Изменение размера изображения с resize()

    Для изменения ширины и высоты есть метод ‘resize’. Этот метод не изменяет текущую картинку, а возвращает новую. Новый размер мы должны указать в виде кортежа ‘(ширина, высота)’. Сохранить картинку можно через метод ‘save’:

    from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # изменяем размер new_image = img.resize((200, 385)) new_image.show() # сохранение картинки new_image.save('F:/hello2.png')

    Изменение размера картинки в Python Pillow

    На примере выше видно, что картинка меняется не пропорционально. Это можно изменить двумя способами:

    Учет соотношения сторон

    Что бы создать пропорциональную картинку вам нужно определиться с размером одно из сторон. В примере ниже указана фиксированная ширина, но вы можете немного изменить скрипт и указать высоту. Мы должны вычислить процентное соотношение старой ширины к новой, а затем умножить ее на высоту:

    from PIL import Image image_path = 'F:/hello.png' # указываем фиксированный размер стороны fixed_width = 200 img = Image.open(image_path) # получаем процентное соотношение # старой и новой ширины width_percent = (fixed_width / float(img.size[0])) # на основе предыдущего значения # вычисляем новую высоту height_size = int((float(img.size[0]) * float(width_percent))) # меняем размер на полученные значения new_image = img.resize((fixed_width, height_size)) new_image.show() new_image.save('F:/hello2.png')

    Пропорциональное изменение размера изображения в Python Pillow

    Создание эскиза thumbnail

    Есть еще один способ выполнить предыдущие шаги автоматически — он называется ‘thumbnail’. Его отличие от resize() в том, что он не может увеличить размер изображения. Если с помощью resize() вы можете изменить размер 200х200 на 400х400, то метод thumbnail() оставит исходный.

    В методе ‘thumbnail()’ создается кортеж с 2-мя числами: максимальная ширина и высота. Понятие «максимальный» нужно оценивать как значение, которое можно менять в меньшую сторону. Если вы возьмете картинку размером 100х100 и захотите ее уменьшить до 100х50, то Pillow высчитает оптимальны размер как 50х50.

    from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) # пропорциональное изменение картинки img.thumbnail(size=(350,400)) img.show() img.save('F:/hello3.png')

    Создание мини-изображение с методом thumbnail в Python Pillow

    Обрезание (cropping) картинки

    Для обрезания ненужных частей картинки используется метод ‘crop()’. Внутри этого метода помещается кортеж со значениями (отступами) соответствующие сторонам, которые нужно обрезать. Стороны можно определить следующими переменными:

    (x1,y1,x2,y2)

    Оси x1 и y1 находятся в левой верхней части изображения, а оси x2 и y2 в правой нижней. Левая верхняя часть имеет координаты 0 и 0, а правая нижняя соответствует ширине и высоте изображения. Картинка, которую я использовал в предыдущих примерах, имеет размер 401х385. Если распределить все координаты, соответствующие этой картинке, получится следующий результат:

    (0,0,401,385)

    Оси при обрезании изображения с crop() в Python Pillow

    Представим, что нам нужно обрезать название на картинке — это примерно 60px. Мы должны вычесть (вырезать) это значение из нижнего правого угла (высоты):

    from PIL import Image image_path = 'F:/hello.png' img = Image.open(image_path) size = img.size width, height = img.size # обрезаем картинку new_image = img.crop((0,0,width,height-60)) new_image.show() new_image.save('F:/hello3.png') 

    Обрезание изображения с crop() в Python Pyllow

    Если бы мы хотели оставить только название, то нужно было бы изменить значение y1 (2-ой индекс):

    (0,height-60,width,height)

    Обрезание изображения с crop() в Python Pyllow

    Создание границ картинки и ее увеличение за счет новой области

    Увеличить размер изображения, не растягивая ее (как делает resize()), можно тремя методами.

    Первый, который так же обсуждался в предыдущей части статьи, увеличит изображение без возможности изменения фона (в зависимости от изображения он может быть черным/прозрачным). В примере ниже мы добавим по 50px к каждому углу:

    (-50,-50,width+50,height+50)

    Расширение картинки в Python Pillow

    Второй способ — за счет создания нового изображения и вставки в него старого.

    Для создания нового изображения нужно использовать метод ‘Image.new()’. В этом методе мы должны указать тип картинки, ее ширину и высоту, а так же цвет. Что бы вставить изображение — используется метод ‘paste()’. В нем указывается отступ формата ‘(верх, лево)’ либо вы можете использовать координаты аналогичные методу ‘crop()’.

    В следующем примере мы создадим изображение, которое будет на 50px больше и вставим в него старую картинку. Картинка будет располагаться в 25px от верхнего и левого края:

    from PIL import Image image_path = 'F:/hello.png' old_img = Image.open(image_path) # создание нового изображения new_image = Image.new(old_img.mode, (old_img.size[0]+50, old_img.size[1]+50), 'white') # вставляем старой изображение в новое new_image.paste(old_img, (25, 25)) new_image.show() new_image.save('F:/hello3.png') 

    Добавление границ и заднего фона в Python Pyllow

    Создание границ изображения с ImageOps.expand

    Создать границы картинки (расширить) так же можно через метод ImageOps.expand(). Вообще через модуль ‘ImageOps’ можно проделать все шаги описанные выше, но он может не работать с какими-то типами изображений.

    В метод ‘expand()’ мы должны передать объект ‘Image’, размер границы и цвет. Пример с результатом аналогичным предыдущему:

    from PIL import Image from PIL import ImageOps image_path = 'F:/hello.png' old_img = Image.open(image_path) # создание нового изображения с белым фоном new_image = ImageOps.expand(old_img, border=25, fill=(255,255,255)) new_image.show() new_image.save('F:/hello3.png') 

    Изменение размера изображения в зависимости от размера QFrame

    Как отобразить разный размер картинки?
    Вот когда меню выдвинуто, пусть отображается значок апекса,
    а когда задвинуто, пусть отображается такая же картинка, но в уменьшенном формате. введите сюда описание изображения введите сюда описание изображения Apex.py:

    import sys from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtGui import QColor, QIcon from PyQt5.uic import * from PyQt5.QtWidgets import * from PyQt5.QtCore import * class Ui_MainWindow(object): def setupUi(self, MainWindow): self.menuvisible = 0 MainWindow.setObjectName("MainWindow") MainWindow.resize(1209, 747) MainWindow.setStyleSheet("") MainWindow.setAnimated(True) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setStyleSheet("background-color: rgb(34, 31, 46);") self.centralwidget.setObjectName("centralwidget") self.frame = QtWidgets.QFrame(self.centralwidget) self.frame.setGeometry(QtCore.QRect(0, 160, 161, 591)) self.frame.setStyleSheet("background-color: rgb(46, 43, 63);") self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") self.weapon = QtWidgets.QPushButton(self.frame) self.weapon.setGeometry(QtCore.QRect(40, 100, 121, 41)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.weapon.sizePolicy().hasHeightForWidth()) self.weapon.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily("Copperplate Gothic Bold") font.setPointSize(14) font.setBold(False) font.setWeight(50) self.weapon.setFont(font) self.weapon.setStyleSheet("QPushButton \n" "\n" "QPushButton:hover \n" "\n" "QPushButton:pressed ") self.weapon.setInputMethodHints(QtCore.Qt.ImhNone) self.weapon.setAutoExclusive(False) self.weapon.setObjectName("weapon") self.spravka = QtWidgets.QPushButton(self.frame) self.spravka.setGeometry(QtCore.QRect(40, 540, 111, 41)) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.spravka.sizePolicy().hasHeightForWidth()) self.spravka.setSizePolicy(sizePolicy) font = QtGui.QFont() font.setFamily("Copperplate Gothic Bold") font.setPointSize(12) font.setBold(False) font.setWeight(50) self.spravka.setFont(font) self.spravka.setStyleSheet("QPushButton \n" "QPushButton:hover \n" "\n" "QPushButton:pressed ") self.spravka.setInputMethodHints(QtCore.Qt.ImhNone) self.spravka.setAutoExclusive(False) self.spravka.setObjectName("spravka") self.label_10 = QtWidgets.QLabel(self.frame) self.label_10.setGeometry(QtCore.QRect(-20, 540, 61, 41)) self.label_10.setText("") self.label_10.setPixmap(QtGui.QPixmap("Nikita_Pfeyfer4.png")) self.label_10.setObjectName("label_10") self.label_9 = QtWidgets.QLabel(self.frame) self.label_9.setGeometry(QtCore.QRect(-30, 100, 81, 41)) self.label_9.setText("") self.label_9.setPixmap(QtGui.QPixmap("Nikita_Pfeyfer2.png")) self.label_9.setObjectName("label_9") self.menu = QtWidgets.QPushButton(self.frame) self.menu.clicked.connect(self.showmenu) self.menu.setGeometry(QtCore.QRect(10, 20, 51, 51)) self.menu.setStyleSheet("background-image: url(:/menu/Изображения/back.png);\n" "border: 1px solid rgba(255, 255, 255, 0);\n" "") self.menu.setText("") self.menu.setObjectName("menu") self.frame_2 = QtWidgets.QFrame(self.centralwidget) self.frame_2.setGeometry(QtCore.QRect(0, 0, 1211, 21)) self.frame_2.setStyleSheet("background-color: rgb(46, 43, 63);") self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_2.setObjectName("frame_2") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setGeometry(QtCore.QRect(610, 90, 231, 41)) font = QtGui.QFont() font.setFamily("Copperplate Gothic Bold") font.setPointSize(28) self.label.setFont(font) self.label.setStyleSheet("color: rgb(253, 253, 253);") self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setObjectName("label") self.line = QtWidgets.QFrame(self.centralwidget) self.line.setGeometry(QtCore.QRect(600, 130, 241, 2)) self.line.setFrameShape(QtWidgets.QFrame.HLine) self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName("line") self.frame_3 = QtWidgets.QFrame(self.centralwidget) self.frame_3.setGeometry(QtCore.QRect(260, 180, 261, 161)) self.frame_3.setStyleSheet("background-color: rgb(46, 43, 63);\n" "border: 2px solid #2e2b3f;\n" "border-radius: 10") self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_3.setObjectName("frame_3") self.label_3 = QtWidgets.QLabel(self.frame_3) self.label_3.setGeometry(QtCore.QRect(70, 0, 121, 41)) font = QtGui.QFont() font.setFamily("Bahnschrift SemiBold") font.setPointSize(22) font.setBold(True) font.setWeight(75) self.label_3.setFont(font) self.label_3.setStyleSheet("color: rgb(194, 194, 194);") self.label_3.setAlignment(QtCore.Qt.AlignCenter) self.label_3.setObjectName("label_3") self.label_4 = QtWidgets.QLabel(self.frame_3) self.label_4.setGeometry(QtCore.QRect(70, 60, 121, 61)) font = QtGui.QFont() font.setFamily("Bahnschrift SemiBold") font.setPointSize(22) font.setBold(True) font.setWeight(75) self.label_4.setFont(font) self.label_4.setStyleSheet("") self.label_4.setAlignment(QtCore.Qt.AlignCenter) self.label_4.setObjectName("label_4") self.textBrowser = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser.setGeometry(QtCore.QRect(570, 170, 256, 351)) self.textBrowser.setStyleSheet("background-color: rgb(46, 43, 63);\n" "border: 2px solid #2e2b3f;\n" "border-radius: 10") self.textBrowser.setObjectName("textBrowser") self.frame_4 = QtWidgets.QFrame(self.centralwidget) self.frame_4.setGeometry(QtCore.QRect(560, 720, 201, 20)) self.frame_4.setStyleSheet("background-color: rgb(46, 43, 63);\n" "border: 2px solid #2e2b3f;\n" "border-radius: 10") self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_4.setObjectName("frame_4") self.label_5 = QtWidgets.QLabel(self.frame_4) self.label_5.setGeometry(QtCore.QRect(50, -2, 101, 21)) font = QtGui.QFont() font.setFamily("Bahnschrift SemiBold SemiConden") font.setPointSize(12) font.setBold(True) font.setWeight(75) self.label_5.setFont(font) self.label_5.setAlignment(QtCore.Qt.AlignCenter) self.label_5.setObjectName("label_5") self.textBrowser_2 = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser_2.setGeometry(QtCore.QRect(260, 360, 261, 161)) self.textBrowser_2.setStyleSheet("background-color: rgb(46, 43, 63);\n" "border: 2px solid #2e2b3f;\n" "border-radius: 10") self.textBrowser_2.setObjectName("textBrowser_2") self.line_2 = QtWidgets.QFrame(self.centralwidget) self.line_2.setGeometry(QtCore.QRect(309, 391, 161, 2)) self.line_2.setFrameShape(QtWidgets.QFrame.HLine) self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName("line_2") self.line_3 = QtWidgets.QFrame(self.centralwidget) self.line_3.setGeometry(QtCore.QRect(331, 219, 121, 2)) self.line_3.setFrameShape(QtWidgets.QFrame.HLine) self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_3.setObjectName("line_3") self.textBrowser_3 = QtWidgets.QTextBrowser(self.centralwidget) self.textBrowser_3.setGeometry(QtCore.QRect(870, 170, 256, 351)) self.textBrowser_3.setStyleSheet("background-color: rgb(46, 43, 63);\n" "border: 2px solid #6c6c00;\n" "border-radius: 10") self.textBrowser_3.setObjectName("textBrowser_3") self.line_4 = QtWidgets.QFrame(self.centralwidget) self.line_4.setGeometry(QtCore.QRect(897, 200, 201, 2)) self.line_4.setFrameShape(QtWidgets.QFrame.HLine) self.line_4.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_4.setObjectName("line_4") self.frame_5 = QtWidgets.QFrame(self.centralwidget) self.frame_5.setGeometry(QtCore.QRect(0, -1, 161, 170)) self.frame_5.setStyleSheet("background-color: rgb(46, 43, 63);") self.frame_5.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame_5.setFrameShadow(QtWidgets.QFrame.Raised) self.frame_5.setObjectName("frame_5") self.mainmenu = QtWidgets.QPushButton(self.frame_5) self.mainmenu.setGeometry(QtCore.QRect(0, 0, 161, 161)) self.mainmenu.setStyleSheet("background-image: url(:/Fone/Изображения/_Logotip_Proz3.png); \n" "border: 1px solid rgba(255, 255, 255, 0);\n" "") self.mainmenu.setText("") self.mainmenu.setObjectName("mainmenu") self.frame_2.raise_() self.frame.raise_() self.label.raise_() self.line.raise_() self.frame_3.raise_() self.textBrowser.raise_() self.frame_4.raise_() self.textBrowser_2.raise_() self.line_2.raise_() self.line_3.raise_() self.textBrowser_3.raise_() self.line_4.raise_() self.frame_5.raise_() MainWindow.setCentralWidget(self.centralwidget) self.action = QtWidgets.QAction(MainWindow) self.action.setObjectName("action") self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.weapon.setText(_translate("MainWindow", "Weapons")) self.spravka.setText(_translate("MainWindow", "Reference")) self.label.setText(_translate("MainWindow", "Main Menu")) self.label_3.setText(_translate("MainWindow", "Версия")) self.label_4.setText(_translate("MainWindow", "1.0 BETA")) self.textBrowser.setHtml(_translate("MainWindow", "\n" "\n" "

    ApexHelper

    \n" "


    \n" "

    Эта программа предназначена для того, чтобы помочь новичкам или опытным игрокам более лучше освоить игру

    \n" "


    \n" "

    _Apex Legends_

    \n" "


    \n" "

    Тут ты найдёшь подробное описание каждого оружия, обвеса и прочих вещей.

    \n" "


    \n" "


    \n" "

    С уважением, Разработчик ApexHelper.

    \n" "


    ")) self.label_5.setText(_translate("MainWindow", "Всё для вас!")) self.textBrowser_2.setHtml(_translate("MainWindow", "\n" "\n" "

    Информация

    \n" "


    \n" "

    Программа находится в разработке, поэтому, пока что присудствует не вся информация

    ")) self.textBrowser_3.setHtml(_translate("MainWindow", "\n" "\n" "

    Кому принадлежит

    \n" "


    \n" "

    Все данные, изображения и прочее из программы, принадлежат компании

    \n" " \n" "

    Respawn Entertainment

    \n" "


    \n" "

    Никому более.

    \n" "


    \n" "

    Их материал был повзаимствован для помощи игрокам.

    ")) self.action.setText(_translate("MainWindow", "справка")) def showmenu(self): self.anim = QPropertyAnimation(self.frame, b'size') self.anim.setDuration(250) if self.menuvisible==0: self.anim.setStartValue(QSize(50,751)) self.anim.setEndValue(QSize(161, 751)) self.menuvisible = 1 else: self.anim.setStartValue(QSize(161,751)) self.anim.setEndValue(QSize(50, 751)) self.menuvisible = 0 #self.anim.finished.connect(self.hidemenu) self.frame.show() self.anim.start() import ApexFone import menu if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_())

    Отслеживать

    73.6k 110 110 золотых знаков 38 38 серебряных знаков 55 55 бронзовых знаков

    Изменение размера изображений с помощью Python

    Я люблю Python и уже давно изучаю его. Некоторое время назад я написал скрипт на Python, в котором мне нужно было изменить размер группы изображений, сохраняя при этом пропорции (пропорции) без изменений. Поэтому я осмотрелся и нашел PIL (Python Imaging Library).

    Вам нужно будет установить PIL, чтобы код работал. Обратите внимание, что PIL, похоже, больше не поддерживается, хотя также доступен его форк под названием Pillow. Чтобы установить PIL в системе на основе Debian, запустите следующую команду в своем терминале от имени пользователя root:

    aptitude install python-imaging

    А теперь код Python для изменения размера изображений при сохранении соотношения сторон.

    import PIL from PIL import Image basewidth = 300 img = Image.open(‘fullsized_image.jpg') wpercent = (basewidth / float(img.size[0])) hsize = int((float(img.size[1]) * float(wpercent))) img = img.resize((basewidth, hsize), PIL.Image.ANTIALIAS) img.save(‘resized_image.jpg')

    Эти несколько строк кода Python изменят размер изображения ( fullsized_image.jpg ) с использованием PIL до ширины 300 пикселей, которая задается в переменной basewidth и высоте, пропорциональной новой ширине. Пропорциональная высота рассчитывается путем определения того, какой процент 300 пикселей является исходной шириной (img.size[0]), а затем умножая исходную высоту (img.size[1]) на этот процент. Полученное значение высоты сохраняется в переменной hsize.

    Вы можете изменить ширину на любое другое число, если вам нужна другая ширина для ваших изображений. Также обратите внимание, что я сохранил измененное изображение под другим именем, resized_image.jpg , потому что я хотел также сохранить полноразмерное изображение ( fullsized_image.jpg ). Вы конечно можете не делать это, используя то же имя файла, чтобы перезаписать полноразмерное изображение с измененным размером, если это то, что вы хотите.

    Если вы используете этот скрипт в Zope в качестве внешнего метода, вам понадобится строка from PIL import Image, чтобы избежать столкновений пространства имен с Zope Image .

    Если высота фиксирована и ширина пропорционально варьируется, это почти одно и то же, вам просто нужно немного поменять местами:

    baseheight = 560 img = Image.open( 'fullsized_image. jpg ') hpercent = (baseheight / float (img.size[1])) wsize = int ((float (img.size[0]) * float (hpercent))) img = img.resize ((wsize, baseheight), PIL.Image.ANTIALIAS) img.save('resized_image.jpg')

    Обратите внимание, что базовая ширина теперь является базовой высотой, так как высота фиксирована. В третьей строке мы вычисляем процент высоты, поэтому нам нужен img.size[1] вместо img.size[0] . Атрибут size — это кортеж, содержащий ширину и высоту в пикселях; size [0] относится к первому элементу кортежа, который является width, а size[1] является вторым элементом, который является height. В строке 4 также есть этот переключатель между sizr[0] для ширины и size[1] для высоты.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *