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

Фото

Сохранение изображения на канве в файл. Python 3.5, tkinter.


  • Чтобы отвечать, сперва войдите на форум
14 ответов в теме

#1 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 16 Июнь 2016 - 18:06

Ломаю голову над этим вопросом. Гугл вместе с Яндексом ничего вразумительного не дал.

 

Первый вопрос: многослоен ли объект Canvas, т.е. все объекты, типа rectangle, sphere, polygon, наслаиваются на канву, или она просто меняет цвет пикселов?

 

Второй вопрос: имеет ли канва переменную, содержащую изображение, которое мы видим на экране?

 

Третий вопрос: как можно, не используя сторонних библиотек, записать в файл изображение с канвы?

 

Первое решение - сделать цикл, в котором пиксел за пикселом будет переноситься в переменную, а потом сохранить это. Но функции выборки пикселов не знаю.

 

Второе решение - так как канва прямоугольная, можно сделать что-то наподобие printscreen'а и обрезать это изображение по уже имеющимся координатам. Но функция printscreen мне неизвестна.


  • 0

#2 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 16 Июнь 2016 - 19:45

Pavel3333, tkinter ужасен.
JS + HTML5 выигрывает.
  • 1

#3 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 16 Июнь 2016 - 22:08

ShadowHunterRUS, в чём-то Вы правы. Но именно на tkinter есть решения этой проблемы?

Есть также вопрос по поводу сохранения растровой графики. Растровая графика представляется в виде пикселов. Пикселы состоят из трех цветов (RGB). Как я понимаю, чистое графическое изображение хранится в виде матрицы, каждая ячейка которой имеет вид RRGGBB, где RR, GG, BB - шестнадцатеричный формат цветов красного, зеленого и синего соответственно. Но такое "чистое" изображение велико в объеме, и его сжимают. Каким образом его сжимают, мне неизвестно. Но не суть. Вопрос в том, что функция file.write(destination, 'w') сохраняет строку. То есть последовательность символов. Даже если изображение есть (самый удобный способ его хранения, имхо, - переменная BitmapImage), то как в памяти компьютера представляется эта переменная BitmapImage? Так же, как я написал?


Изменено: Pavel3333, 16 Июнь 2016 - 22:16

  • 0

#4 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 16 Июнь 2016 - 22:17

Но именно на tkinter есть решения этой проблемы?

http://stackoverflow...ent-to-an-image


Каким образом его сжимают, мне неизвестно

Это на самом деле очень интересно.
https://ru.wikipedia...нных_с_потерями
https://ru.wikipedia...атие_без_потерь

Изменено: ShadowHunterRUS, 16 Июнь 2016 - 22:23

  • 1

#5 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 16 Июнь 2016 - 22:19

Это на самом деле очень интересно.

 

В таком случае почитаю об этом, спасибо за ссылки.

 

 

http://stackoverflow...ent-to-an-image

А это очень полезная ссылка, спасибо огромное.


Изменено: Pavel3333, 16 Июнь 2016 - 22:26

  • 0

#6 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 16 Июнь 2016 - 22:34

file.write(destination, 'w') сохраняет строку.

from struct import pack
with open('file.txt', 'wb') as f:
    f.write(pack('3B', 255, 255, 255))
Вместо 6 символов FFFFFF запишутся 3.

Изменено: ShadowHunterRUS, 16 Июнь 2016 - 22:39

  • 1

#7 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 16 Июнь 2016 - 22:58

Понял, спасибо.


  • 0

#8 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 17 Июнь 2016 - 15:16

ShadowHunterRUS, а не подскажете, как можно переписать не сам файл, а один его байт? Просмотрел структуру BMP формата, и надобно изменять байты со смещения 54 (36 в шестнадцатеричной с.с.), т.к. они задают цвет пикселям. Как это сделать?


Изменено: Pavel3333, 17 Июнь 2016 - 15:16

  • 0

#9 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 17 Июнь 2016 - 17:57

как можно переписать не сам файл, а один его байт?

никак. только целиком переписать файл.
with open('file.bmp', 'rb') as f:
    data = f.read()
    data = data[:54] + '\xff' + data[55:]
with open('file.bmp', 'wb') as f:
    f.write(data)

Изменено: ShadowHunterRUS, 17 Июнь 2016 - 18:07

  • 1

#10 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 17 Июнь 2016 - 19:06

http://stackoverflow...ent-to-an-image
 PIL убрали в 3-й версии Питона. Пробовал установить Pillow, при 
from PIL import Image

выскакивает ошибка

Traceback (most recent call last):
  File "D:\Павел (НЕ СТИРАТЬ!)\1.py", line 2, in <module>
    from PIL import Image, ImageDraw
  File "C:\Users\pk\AppData\Local\Programs\Python\Python35\lib\site-packages\PIL\Image.py", line 66, in <module>
    from PIL import _imaging as core
ImportError: DLL load failed: %1 не является приложением Win32.

Скомпилировали неправильно, видимо.

 

Как скомпилировать модуль _imaging на MinGW, если имеется Makefile, куча .h и .c файлов?


  • 0

#11 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 17 Июнь 2016 - 19:36

Скомпилировали неправильно, видимо.

Python x64 ипортирует только x64 DLL, соответсвенно Python x32 ипортирует только x32
  • 1

#12 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 17 Июнь 2016 - 21:01

Ах, точно, установил же 32-х битную версию. Спасибо.

Установщик Pillow 3.2.0 (https://pypi.python....pi/Pillow/3.2.0) x32 не распознает установленную версию Python 3.5.0 x32, а х64 установщик распознает, но в упор выдает траблу, мол, не хватает vcruntime140.dll.  Чую, что либо в реестре надо лазать, либо длл-ку куда-то закинуть (в C://Windows/System32?)...

 

UPD Скачал egg-архив, всё отлично.


Изменено: Pavel3333, 17 Июнь 2016 - 21:14

  • 0

#13 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 21 Июнь 2016 - 18:36

ShadowHunterRUS, теперь появилась проблема с открытием файла. 

Код

 

Если код этой функции скопировать в тело программы (после инициализации канвы), то всё прекрасно работает, изображение переносится на канву. Но если исполнить функцию (например, через кнопку), то ничего не отображается. В чём дело?

Код программы

  • 0

#14 SkepticalFox

SkepticalFox

    ShadowHunterRUS

  • Premium Member
  • 3 355 сообщений
  • Nick:SkepticalFox
  • WoT Server:RU (Русский)
  • Город: Moscow

Опубликовано 22 Июнь 2016 - 11:19

canv

А куда потерялся canv.pack() ?
  • 0

#15 Pavel3333

Pavel3333

    Няффко

  • Пользователь
  • 1 641 сообщений
  • Nick:Buffalo73rus
  • WoT Server:RU (Русский)
  • Skype: pavel.html
  • Город: Москва/Дмитров

Опубликовано 22 Июнь 2016 - 11:41

Это была часть программы, использовал метод place(): 

canv.place(x=1, y=45)


  • 0





0 пользователей читают эту тему

0 зарегистрированных, 0 гостей, 0 невидимых

© Mr 13