LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Software (https://www.linuxquestions.org/questions/linux-software-2/)
-   -   PIL Image im.show() no show! (https://www.linuxquestions.org/questions/linux-software-2/pil-image-im-show-no-show-4175716654/)

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:]))


computersavvy 09-12-2022 10:45 AM

Changing the ownership of /tmp would be a very bad thing. /tmp is world readable and writable so that would have no affect anyway.

When you try that command have you looked in /tmp to see if the file actually exists (before doing anything else)?

Are there any other error messages?

From that image it could be several things as the cause.
1. The file was not saved at that location, or not saved at all.
2. The file was not named as expected.
3. The path to read the file is incorrect.
4. The python used to read the data is mismatched between functions. (maybe some is from the system python that could be python 3.10 and your venv python is 3.8, or 2.7, or ?)

You have not said what version is in the venv and what is installed on the system. There have been noticable changes as python has been improved over time.

Were any system updates done between the time it last worked and now? If so then it could easily be an update to the code on your system that broke functioning of the program.

Pedroski 09-12-2022 05:17 PM

Thanks for your reply!

Weird! This morning, it's 05:45 here, I just tried it again.

The cropped image showed up in an imagemagick window, just like it should.

I didn't change anything!

So ran my OMR programme, also no problem, the cropped image showed in imagemagick, just like it should!

I adjusted the coordinates a couple of times

Mysteriously working again!

One thing I did was try to uninstall pillow. But I don't think it uninstalled, because when I tried to reinstall with pip, it just said "is already the latest version"


All times are GMT -5. The time now is 10:42 AM.