Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problems with other data-types than uint8 #4887

Closed
emilettele opened this issue Aug 24, 2020 · 6 comments · Fixed by #6638
Closed

Problems with other data-types than uint8 #4887

emilettele opened this issue Aug 24, 2020 · 6 comments · Fixed by #6638
Labels

Comments

@emilettele
Copy link

emilettele commented Aug 24, 2020

What did you do?

I was trying to create an Image from a numpy array using Image.fromarray(array, mode) and validate the created image by using the show() function. It did not create the right image.

What did you expect to happen?

Show a white image

What actually happened?

Showed an image with seperated colors.

What are your OS, Python and Pillow versions?

  • OS: Windows
  • Python: 3.6.8
  • Pillow: 7.2.0

What is the problem?

Pillow shows the right image if the dtype of the values in the array is uint8, but seems to have problems accepting other data types.

import numpy as np
from PIL import Image

array = np.full((32,32,3),255)
array[0].dtype
image = Image.fromarray(array, "RGB")
image.show()

wrong

It does however work if I first convert the array to uint8:

import numpy as np
from PIL import Image

array = np.full((32,32,3),255)
array = np.uint8(array)
array[0].dtype
image = Image.fromarray(array, "RGB")
image.show()

right

@nulano
Copy link
Contributor

nulano commented Aug 24, 2020

Related to #1888.

@emilettele
Copy link
Author

After going through some of the related issues I now see that @wiredfool commented on 12 Jan 2018 in #2955:
"That's a 16 bit per channel RGB image, and Pillow doesn't support multi channel images with more than 8 bpc. It's a longstanding issue."

In my opinion, it would be nice if there would at least be an error text that can explain this limitation of 8bpc. Also, this limitation could be made a lot more clear on the information pages. Since I did not know about this, it took me quite some time to fix the problem.

@radarhere radarhere changed the title Pillow still seems to have problems with other data-types than uint8. Problems with other data-types than uint8 Aug 25, 2020
@radarhere
Copy link
Member

I'll point out that an error is displayed - if you don't pass mode to fromarray.

import numpy as np
from PIL import Image

array = np.full((32,32,3),255)
Image.fromarray(array)
Traceback (most recent call last):
  File "PIL/Image.py", line 2777, in fromarray
KeyError: ((1, 1, 3), '<i8')

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "demo.py", line 5, in <module>
    Image.fromarray(array)
  File "PIL/Image.py", line 2779, in fromarray
TypeError: Cannot handle this data type: (1, 1, 3), <i8

@radarhere
Copy link
Member

I think the fact that an error isn't displayed can be considered part of #2856

@radarhere
Copy link
Member

Also, this limitation could be made a lot more clear on the information pages. Since I did not know about this, it took me quite some time to fix the problem.

Do you have any ideas where a good place for this documentation would be? https://pillow.readthedocs.io/en/stable/handbook/concepts.html#modes doesn't seem like the right place, since it is about the modes that Pillow uses to store image data, not about the modes used to read image data from files.

@radarhere
Copy link
Member

I've created PR #6638 to resolve this by documenting the current limitation.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants