Pedroski |
09-12-2022 04:27 AM |
PIL Image im.show() no show!
1 Attachment(s)
I had this problem before, but when I moved to a virtual environment, it went away.
Now, I can't do img.show() in either of my VENVs nor outside of VENV.
Anyone know what's wrong?
I have a little home-made OMR programme, the multichoice answer forms are made as PDFs. When I mark them, I scan the answer sheets to PDF, then split the PDF to .jpgs.
Each jpg needs to be cropped to just the size of a column of multichoice answers.
To do that, when I make the answers forms, I take 1 page of the PDF and crop it to get the crop coordinates.
Of course, I need to look and check that the crop coodinates are OK for any particular page.
Now, im.show() won't work anywhere and I don't know why!
Any tips please? Previously, this worked fine, now im.show() can't display!
The owner of /tmp is root. I thought, if I made myself the owner, the problem might go away, but I can't change the ownership, the owner of tmp remains root.
Code:
from PIL import Image, ImageOps
image = '/home/pedro/winter2022/OMR/21BE/pdfs/21BE1_wWeek3_Answer_Forms1.jpg'
def cropImage(image):
print('\n running cropImage() ... \n')
print('\n you need crop coordinates for each column \n')
# Opens an image in RGB mode
im = Image.open(image)
im.show()
# Size of the image in pixels (size of orginal image)
# Just for information
width, height = im.size
print('This image is: ', width, ' wide and ', height, ' high')
accept = ['yes']
answer = 'X'
while not answer in accept:
print('enter the crop image top left and bottom right coordinates.')
print('get rid of the question numbers too, don\'t need them')
print('try something like 100 290 600 2250 for the first column')
print('try something like 650 290 1400 2250 for the second column')
print('this is for a second column with A to I answers ... ')
corners = input('Enter your 4 numbers, separated by a space ... ')
# later should be able to use fixed values for the y coordinate because it won't change
# work on that!!
coords = corners.split()
for i in range(len(coords)):
coords[i] = int(coords[i])
# Cropped image of above dimension
# (It will not change orginal image)
im1 = im.crop((coords[0], coords[1], coords[2], coords[3]))
# Shows the image in image viewer
im1.show()
print('Do you accept this image')
answer = input('Enter yes to accept, anything else to try again ')
if answer == 'yes':
print('image crop coordinates saved to tup ... ')
return (coords[0], coords[1], coords[2], coords[3])
This is the PIL Image.show.py I have, don't know why it is not working.
If I use the command line, both
Quote:
pedro@pedro-HP:~/Desktop$ display Hellenic.jpeg
pedro@pedro-HP:~/Desktop$ eog Hellenic.jpeg
pedro@pedro-HP:~/Desktop$
|
display the image correctly, so both imagemagick and eog are installed.
Code:
#
# The Python Imaging Library.
# $Id$
#
# im.show() drivers
#
# History:
# 2008-04-06 fl Created
#
# Copyright (c) Secret Labs AB 2008.
#
# See the README file for information on usage and redistribution.
#
import os
import shutil
import subprocess
import sys
import tempfile
from shlex import quote
from PIL import Image
_viewers = []
def register(viewer, order=1):
try:
if issubclass(viewer, Viewer):
viewer = viewer()
except TypeError:
pass # raised if viewer wasn't a class
if order > 0:
_viewers.append(viewer)
elif order < 0:
_viewers.insert(0, viewer)
def show(image, title=None, **options):
r"""
Display a given image.
:param image: An image object.
:param title: Optional title. Not all viewers can display the title.
:param \**options: Additional viewer options.
:returns: True if a suitable viewer was found, false otherwise.
"""
for viewer in _viewers:
if viewer.show(image, title=title, **options):
return 1
return 0
class Viewer:
"""Base class for viewers."""
# main api
def show(self, image, **options):
# save temporary image to disk
if not (
image.mode in ("1", "RGBA") or (self.format == "PNG" and image.mode == "LA")
):
base = Image.getmodebase(image.mode)
if image.mode != base:
image = image.convert(base)
return self.show_image(image, **options)
# hook methods
format = None
options = {}
def get_format(self, image):
"""Return format name, or None to save as PGM/PPM"""
return self.format
def get_command(self, file, **options):
raise NotImplementedError
def save_image(self, image):
"""Save to temporary file, and return filename"""
return image._dump(format=self.get_format(image), **self.options)
def show_image(self, image, **options):
"""Display given image"""
return self.show_file(self.save_image(image), **options)
def show_file(self, file, **options):
"""Display given file"""
os.system(self.get_command(file, **options))
return 1
# --------------------------------------------------------------------
if sys.platform == "win32":
class WindowsViewer(Viewer):
format = "PNG"
options = {"compress_level": 1}
def get_command(self, file, **options):
return (
'start "Pillow" /WAIT "%s" '
"&& ping -n 2 127.0.0.1 >NUL "
'&& del /f "%s"' % (file, file)
)
register(WindowsViewer)
elif sys.platform == "darwin":
class MacViewer(Viewer):
format = "PNG"
options = {"compress_level": 1}
def get_command(self, file, **options):
# on darwin open returns immediately resulting in the temp
# file removal while app is opening
command = "open -a Preview.app"
command = "({} {}; sleep 20; rm -f {})&".format(
command, quote(file), quote(file)
)
return command
def show_file(self, file, **options):
"""Display given file"""
fd, path = tempfile.mkstemp()
with os.fdopen(fd, "w") as f:
f.write(file)
with open(path, "r") as f:
subprocess.Popen(
["im=$(cat); open -a Preview.app $im; sleep 20; rm -f $im"],
shell=True,
stdin=f,
)
os.remove(path)
return 1
register(MacViewer)
else:
# unixoids
class UnixViewer(Viewer):
format = "PNG"
options = {"compress_level": 1}
def get_command(self, file, **options):
command = self.get_command_ex(file, **options)[0]
return "({} {}; rm -f {})&".format(command, quote(file), quote(file))
def show_file(self, file, **options):
"""Display given file"""
fd, path = tempfile.mkstemp()
with os.fdopen(fd, "w") as f:
f.write(file)
with open(path, "r") as f:
command = self.get_command_ex(file, **options)[0]
subprocess.Popen(
["im=$(cat);" + command + " $im; rm -f $im"], shell=True, stdin=f
)
os.remove(path)
return 1
# implementations
class DisplayViewer(UnixViewer):
def get_command_ex(self, file, **options):
command = executable = "display"
return command, executable
if shutil.which("display"):
register(DisplayViewer)
class EogViewer(UnixViewer):
def get_command_ex(self, file, **options):
command = executable = "eog"
return command, executable
if shutil.which("eog"):
register(EogViewer)
class XVViewer(UnixViewer):
def get_command_ex(self, file, title=None, **options):
# note: xv is pretty outdated. most modern systems have
# imagemagick's display command instead.
command = executable = "xv"
if title:
command += " -name %s" % quote(title)
return command, executable
if shutil.which("xv"):
register(XVViewer)
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Syntax: python ImageShow.py imagefile [title]")
sys.exit()
print(show(Image.open(sys.argv[1]), *sys.argv[2:]))
|