Как узнать размер картинки python
Перейти к содержимому

Как узнать размер картинки python

  • автор:

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » Как узнать разрешение изображения по URL, используя python-2.7?

#1 Фев. 15, 2018 16:49:29

dmitriigoog Зарегистрирован: 2018-02-15 Сообщения: 2 Репутация: 0 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

Имеется список URL’ов картинок форматов jpg, jpeg, png (около 100к шт.). Необходимо без загрузки узнать: не меньше ли это изображение чем 640х480

Отредактировано dmitriigoog (Фев. 15, 2018 17:35:25)

#2 Фев. 16, 2018 11:03:55

scidam Зарегистрирован: 2016-06-15 Сообщения: 288 Репутация: 35 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

import urllib >>> url=urllib.urlopen('http://python.su') >>> url.headers.keys() ['content-length', 'vary', 'server', 'connection', 'date', 'content-type'] >>> url.headers['content-length'] '96309' 

Далее, нужно загрузить, скажем, 100 изображений различных. Найти минимальный размер в байтах того из этих изображений, которое больше 640×480. Найти долю изображений по размеру больших найденного минимального размера, но не являющиеся большими 640×480 (9000×90 например не является большим, т.к. 90<480).
Если размер в байтах у проверяемого изображения больше найденного минимального, то можно считать, что он больше 640×480 с ошибкой приблизительно равной найденной доли

Многое, однако, в этом случае, зависит от 100 тестовых изображений, насколько они репрезентативны в отношении 100k изображений, которые планируется проверять.

Отредактировано scidam (Фев. 16, 2018 11:26:39)

#3 Фев. 16, 2018 11:45:25

Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2638 Репутация: 179 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

> Далее, нужно загрузить, скажем, 100 изображений различных

ТС ничего загружать не хочет. Он думает что разрешение передаётся по интернет-протоколу.

> Найти минимальный размер в байтах того из этих изображений, которое больше 640×480…Многое, однако, в этом случае, зависит от 100 тестовых изображений

Вот ты сейчас какую-то ерунду написал.

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

#4 Фев. 16, 2018 12:14:03

scidam Зарегистрирован: 2016-06-15 Сообщения: 288 Репутация: 35 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

Rodegast
Вот ты сейчас какую-то ерунду написал.

Вполне возможно, ночь не спал… смысл в общем должен быть такой: размер изображения, в принципе, можно получить через content-length. Теперь, чтобы принимать решение о том, большее оно 640×480 или нет (будем считать, что изображение больше 480×640 (определим такой класс) если оба w и h его больше соответствующих значений), нужно попытаться построить решающее правило, для этого я предложил сформировать выборку из малого числа (100) изображений, и оценивать принадлежность классу “больше 640×480” на основе размера изображения. Это конечно будет давать возможно большую ошибку. Но если изображения более менее похожи по соотношению сторон, цветовому набору, сжаты одинаково, может и сработает, т.е. результат будет лучше случайного гадания.

#5 Фев. 16, 2018 13:42:00

Rodegast От: Пятигорск Зарегистрирован: 2007-12-28 Сообщения: 2638 Репутация: 179 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

> будем считать, что изображение больше 480×640 (определим такой класс) если оба w и h его больше соответствующих значений

Это не правильно. Разрешение это площадь в пикселах которую будет занимать изображения, по этому что-бы сравнить размер изображения нужно сначала вычислить количество пикселей. Например:

>>> 640 * 480 > 9000 * 90 False 

С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

#6 Фев. 16, 2018 23:33:23

scidam Зарегистрирован: 2016-06-15 Сообщения: 288 Репутация: 35 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

Постановка задачи неопределенная:

dmitriigoog
не меньше ли это изображение чем 640х480

Я потому и написал, что “определим такой класс изображений”. Я понял, что понятие “не меньше” чем 640×480 подразумевает, что соответствующие размеры изображения не меньше данных значений, т.е. 640 и 480.
Определение через число пикселей, конечно, более естественное, и с ним подход с обучением будет работать еще лучше;

#7 Фев. 17, 2018 12:58:15

passant Зарегистрирован: 2018-02-17 Сообщения: 43 Репутация: 4 Профиль Отправить e-mail

Как узнать разрешение изображения по URL, используя python-2.7?

Вклинюсь в вашу беседу. Мне кажется, что задача сформулирована изначально неправильно. Дело в том, что размер файла формата jpeg не зависит (а уж линейно — тем более) от размера файла. Кто не верит — тривиальный пример: генерируем две картинки одного размера, одну заливаем одним цветом, вторую — случайным образом зашумляем. (В Фотошопе — в один клик) потом сравниваем результаты. Поэтому, даже применяя методы машинного обучения, вначале надо выяснить, что картинки как минимум однотипны, потом строить кластеры, потом — обучать классификатор, потом — получать результат с весьма немалой ошибкой. Я думаю, топикстартер не этого ожидал. » без загрузки узнать: не меньше ли это изображение чем 640х480″ — не представляется возможным, по крайней мере с достаточно степенью надежности результата.

Отредактировано passant (Фев. 17, 2018 13:03:22)

Как менять размер изображения при помощи Python?

Возможно, вам нужно изменить размер фотографии, используя для этого Python. Лично мне это необходимо для размещения изображений для рассылки по почте или для поста на сайте, но изображения слишком большие. Как правило, для этих целей используют редакторы. Я также пользуюсь ими, но ради интереса я покажу, как это делается при помощи языка программирования Python. Самый быстрый способ сделать это – использовать пакет Pillow, который можно установить при помощи pip.

pip install Pillow

После этого, открываем свой любимый редактор кода и пробуем следующий код:

from PIL import Image
def resize_image ( input_image_path ,
output_image_path ,
original_image = Image . open ( input_image_path )
width , height = original_image . size
print ( ‘The original image size is wide x ‘
‘high’ . format ( wide = width , height = height ) )
resized_image = original_image . resize ( size )
width , height = resized_image . size
print ( ‘The resized image size is wide x ‘
‘high’ . format ( wide = width , height = height ) )
resized_image . show ( )
resized_image . save ( output_image_path )
if __name__ == ‘__main__’ :
resize_image ( input_image_path = ‘caterpillar.jpg’ ,
output_image_path = ‘caterpillar_small.jpg’ ,
size = ( 800 , 400 ) )

Здесь мы импортируем класс Image из пакета Pillow. Далее, мы видим функцию, которая принимает три аргумента:

  • Локация файла, который мы хотим открыть;
  • Локацию, куда мы хотим сохранить измененное изображение;
  • Кортеж, который демонстрирует новый размер изображения, где кортеж – это ширина и высота.

Далее, мы открываем изображение и вводим его размер. После этого, мы вызываем метод resize() объекта изображения с размером переданного кортежа. Наконец, мы берем новый размер, выводим его и открываем изображение перед тем, как сохранить изменения. Теперь оно выглядит вот так:

Как менять размер изображения при помощи Python?

Как мы видим, метод resize() ничего не делает с масштабированием. Давайте разберемся с этой задачей!

Масштабирование изображения

Скорее всего, изменять размер изображения таким образом, как мы видели выше, вам не хочется, для лучшего результата нужно написать метод масштабирования. Проблема с предыдущим методом в том, что он не учитывает соотношения сторон картинки. Так что вместо изменения размера, вы можете просто использовать метод thumbnail(). Давайте попробуем:

Pillow — работа с картинками

Pillow — самая популярная библиотека для работы с изображениями в Python. С помощью неё картинки можно открывать, вращать, накладывать фильтры и даже работать с отдельными пикселями.

Обзор

Импортируется библиотека так:

from PIL import Image 

Pillow — улучшенная версия библиотеки PIL , поэтому импортируется она таким странным образом. В коде она будет называться PIL .

Далее попробуем что-нибудь сделать с картинкой:

from PIL import Image image = Image.open("example.jpg") rotated_image = image.rotate(45) rotated_image.save("rotated.jpg") 

Сначала открываем картинку с названием example.jpg и кладём её в переменную image . На следущей строке поворачиваем картинку на 45 градусов. Метод .rotate() не меняет картинку, а создаёт новую, поэтому положим её в переменную rotated_image . И в конце сохраняем повёрнутую картинку в новый файл rotated.jpg .

Атрибуты картинок

В Pillow есть новые типы данных: JpegImageFile , PngImageFile … Они позволяют хранить картинки прямо в переменных Python. У картинок есть несколько атрибутов, которые понадобятся вам в будущем:

  • format — формат данных картинки: jpeg , png …
  • mode — цветовая модель картинки: CMYK , RGB , L — для чёрно-белых изображений.
  • width — ширина картинки в пикселях.
  • height — высота картинки в пикселях.
  • size — размер картинки в пикселях. Возвращает tuple : (ширина, высота).

Как их извлечь:

from PIL import Image image = Image.open("example.jpg") print(image.format) # Выведет JPG print(image.mode) # Например, может вывести RGB 

Открыть картинку

Для открытия картинки используется функция Image.open() .

В качестве аргументов она принимает на вход путь до файла, который нужно открыть:

from PIL import Image image = Image.open("example.jpg") 

Сохранить картинку в файл

Для сохранения картинки есть метод .save() .

В качестве аргументов он принимает:

  • Путь до файла, в который сохранить картинку.
  • Именованный необязательный параметр format , в котором передаётся формат сохраняемой картинки.
from PIL import Image image = Image.open("example.jpg") image.save("new.jpg") image.save("another.jpg", format="JPEG") 

В качестве результата появится 2 копии картинки: new.jpg и another.jpg .

Перевести картинку в другую цветовую модель

О цветовой модели вы можете прочитать в разделе Атрибуты. Чтобы поменять цветовую модель картинки, нужно воспользоваться методом .convert() . Он принимает на вход именной аргумент mode :

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вывелось RGB cmyk_image = image.convert("CMYK") print(cmyk_image.mode) # Вывелось CMYK print(image.mode) # Вывелось RGB 

Заметим, что метод не меняет исходную картинку, а создаёт её копию с цветовой моделью CMYK . Поэтому мы положили её в отдельную переменную.

Обрезать картинку

За обрезание картинки отвечает метод .crop() . Он принимает на вход кортеж из 4 чисел: координат углов новой картинки. Координаты отсчитываются с левого верхнего угла картинки:

Координаты нужно передать в таком порядке: слева, сверху, справа, снизу. Например, вы хотите отрезать 10 пикселей слева и 15 сверху:

from PIL import Image image = Image.open("example.jpg") coordinates = (10, 15, image.width, image.height) cropped = image.crop(coordinates) # Отрежется 10 пикселей слева и 15 сверху 

Этот код отрезает 10 пикселей слева и 15 сверху. Самая правая координата — это и есть ширина картинки, а самая нижняя — высота, поэтому мы и использовали эти атрибуты картинки.

Разделить картинку на каналы

Картинки состоят из пикселей разных цветов. Каждый пиксель картинки в RGB состоит из 3 значений: сколько в нём красного, сколько зелёного и сколько синего. А в цветовой схеме CMYK из четырёх: голубой, пурпурный, жёлтый и чёрный. Все значения от 0 до 255. 0 — нет такого цвета, а 255 — его очень-очень много.

На самом деле картинки хранят не по пикселям, а по каналам. RGB картинка хранится как 3 картинки: в первой в каждом пикселе число от 0 до 255, показывающее, сколько в нём красного. Во второй то же, только с зелёным, а в третьем — с синим.

Получается 3 картинки. Но если взять какой-то цветовой канал отдельно от картинки, то она не будет знать, какой цвет ей показывать. У неё в каждом пикселе всего одно значение от 0 до 255. Поэтому она отображается как чёрно-белая. Если в пикселе хранится 0, то пиксель будет чёрный, а если 255 — белый. Чем больше число, тем светлее пиксель.

Метод .split() разбивает картинку на каналы. Работает так:

from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки. 

Собрать картинку из каналов

Pillow позволяет разделять картинку на каналы. Но так же позволяет и собирать её обратно. За это отвечает функция Image.merge() . Она принимает на вход 2 аргумента:

  • Цветовая модель будущей картинки
  • Кортеж из цветовых каналов. Если модель RGB, то первый канал будет покрашен в красный, второй в зелёный, третий в синий.
from PIL import Image image = Image.open("example.jpg") print(image.mode) # Вернуло CMYK, значит канала 4 cyan, magenta, yellow, key_color = image.split() # В переменные запишутся 4 чёрно-белые картинки. new_image = Image.merge("CMYK", (cyan, magenta, yellow, key_color)) 

new_image ничем не отличается от image , т.к. состоит из тех же каналов в том же порядке.

Покрасить цветовой канал

Pillow позволяет раскрашивать чёрно-белые картинки. За это отвечает функция ImageOps.colorize() .

Она принимает 3 аргумента: Картинка, какой цвет показывать вместо чёрного и какой вместо белого. Пример:

from PIL import Image, ImageOps image = Image.open("example.jpg") colorized = ImageOps.colorize(image, black ="red", white ="yellow") 

Код выше сделает из такой картинки:

Изменить размер картинки

Как работает thumbnail

Метод resize приводит картинку к желаемому размеру без сохранения пропорций. Картинка жмётся, становится некрасивой:

Метод thumbnail сохраняет пропорции:

Подробнее о thumbnail

С помощью метода .thumbnail() можно легко сделать миниатюру изображения. Миниатюра — уменьшенная версия картинки, с сохранением пропорций. На вход принимается кортеж с максимальными шириной и высотой. Метод .thumbnail() сам подберёт новые координаты так, чтобы картинка поместилась в заданную область. Например, у вас есть картинка 800×1200 и вы хотите поместить её в рамку 1200×600, то результат метода будет 400×600, т.к. 400×600 как раз помещается в 1200×600:

from PIL import Image image = Image.open("example.jpg") print(image.size) # Вывелось (800, 1200) image.thumbnail((1200, 600)) # Картинка теперь размера 400 на 600 print(image.size) # Вывелось (400, 600) 

Наложить картинки друг на друга

Функция Image.blend() создаёт новую картинку, накладывая одно изображение поверх другого. Для работы ему необходимы три аргумента:

  • Первая картинка.
  • Вторая картинка, того же размера, что и первая.
  • Коэффициент прозрачности.

Если прозрачность равна 0.5, то картинки смешаются в равных долях. Если коэффициент равен 1.0, то первая картинка станет полностью прозрачной и останется только вторая. Если 0.0, то наоборот. Прозрачность задаётся дробным числом через точку.

from PIL import Image image1 = Image.open("image1.jpg") image2 = Image.open("image2.jpg") image3 = Image.blend(image1, image2, 0.5) # Получится картинка, сложенная из двух 

Наложить со смещением

Отдельного метода для этого нет, но получается за счёт комбинации .crop() и Image.blend().

  1. Выберите картинку для эффекта. У нас это картинка wave.png с шириной в 1000 пикселей.
  2. Отрежьте от неё 200 пикселей слева. Получится wave_left.png шириной 800 пикселей.
  3. Возьмите исходную картинку wave.png и отрежьте от неё по 100 пикселей с обоих сторон: слева и справа. Получится wave_middle.png тоже шириной в 800 пикселей.
  4. Наложите wave_left.png на wave_middle.png с помощью Image.blend()
  5. Сохраните в файл то, что получилось. Это картинка смещённая влево.

Попробуйте бесплатные уроки по Python

Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.

Переходите на страницу учебных модулей «Девмана» и выбирайте тему.

Получение и изменение размера изображения в Python

Чтобы получить размер изображения с помощью Pillow в Python, используйте свойство size объекта Image. Свойство size возвращает ширину и высоту изображения.

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

Синтаксис

Синтаксис для использования свойства size объекта PIL Image приведен ниже.

im = Image.open("sample-image.png") im.size

Пример 1

В следующей программе мы будем читать и изображать, а затем распечатывать его размер, используя свойство size объекта Image.

from PIL import Image #read the image im = Image.open("sample-image.png") #image size print(im.size)
(640, 400)

Пример 2: доступ к ширине и высоте

Вы можете получить доступ к высоте и ширине из свойства size, используя index. В следующем примере мы получим ширину и высоту изображения.

from PIL import Image #read the image im = Image.open("sample-image.png") #image size width = im.size[0] height = im.size[1] print('Width of the image is:', width) print('Height of the image is:', height)
Width of the image is: 640 Height of the image is: 400

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

Изменение размера изображения

Чтобы изменить размер изображения с помощью Pillow, вы можете использовать метод resize() класса PIL.Image.Image. Вы можете передать такие параметры, как размер результирующего изображения, фильтр передискретизации пикселей и область блока источника, которую необходимо учитывать.

Синтаксис

Синтаксис метода resize() показан в следующем фрагменте кода.

Image.resize(size, resample=0, box=None)
  • size передается, как кортеж (ширина, высота). Это размер, запрошенный для результирующего выходного изображения после изменения размера.
  • resample – это фильтр, который должен использоваться для повторной выборки, это необязательно. Вы можете пройти:
    • PIL.Image.NEAREST;
    • PIL.Image.BOX;
    • PIL.Image.BILINEAR;
    • PIL.Image.HAMMING;
    • PIL.Image.BICUBIC;
    • PIL.Image.LANCZOS.

    Если для параметра размера заданы правильные значения, вы можете уменьшить или увеличить входное изображение.

    Пример 1: со значениями по умолчанию

    В следующем примере мы прочитаем изображение и изменим его размер до (200, 200).

    from PIL import Image #read the image im = Image.open("sample-image.png") #image size size=(200,200) #resize image out = im.resize(size) #save resized image out.save('resize-output.png')

    Входное изображение

    Выходное изображение

    Для изменения размера рассматривается все исходное изображение, поскольку мы не предоставили никакого значения для параметра box. В следующем примере мы предоставим параметр box и найдем выходное изображение.

    Пример 2: с помощью поля входного изображения

    В следующем примере мы предоставим параметр box. При этом мы рассматриваем только область поля входного изображения, а затем изменяем его размер до нужного размера.

    from PIL import Image #read the image im = Image.open("sample-image.png") #image size size = (200,200) box = (100,100,500,400) #resize image out = im.resize(size, box=box) #save resized image out.save('resize-output.png')

    Выходное изображение

    Если вы заметили, для действия изменения размера учитывается только прямоугольная часть входного изображения.

    В этом руководстве на примерах Python мы узнали, как изменить размер изображения с помощью библиотеки PIL.

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

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