Saving Image with Pil

I am trying to save an image that I created from scratch with PIL

newImg1 = PIL.Image.new('RGB', (512,512))
pixels1 = newImg1.load()

...

for i in range (0,511):
    for j in range (0,511):
       ...
            pixels1[i, 511-j]=(0,0,0)
        ...

newImg1.PIL.save("img1.png")

and I get the following error:

Traceback (most recent call last): File "", line 1, in File "C:\Python27\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 523, in runfile execfile(filename, namespace) File "C:\Python27\Lib\site-packages\xy\pyimgmake.py", line 125, in newImg1.PIL.save("img1.png") File "C:\Python27\lib\site-packages\PIL\Image.py", line 512, in getattr raise AttributeError(name) AttributeError: PIL

I need help interpreting this error and how to save the image properly as "img1.png" (I am fine with the image being saved to the default save spot).


UPDATE:

from PIL import Image as pimg
...
newImg1 = pimg.new('RGB', (512,512))
...
newImg1.save("img1.png")

and I get the following error:

... newImg1.save("img1.png") File "C:\Python27\lib\site-packages\PIL\Image.py", line 1439, in save save_handler(self, fp, filename) File "C:\Python27\lib\site-packages\PIL\PngImagePlugin.py", line 572, in _save ImageFile._save(im, _idat(fp, chunk), [("zip", (0,0)+im.size, 0, rawmode)]) File "C:\Python27\lib\site-packages\PIL\ImageFile.py", line 481, in _save e = Image._getencoder(im.mode, e, a, im.encoderconfig) File "C:\Python27\lib\site-packages\PIL\Image.py", line 399, in _getencoder return apply(encoder, (mode,) + args + extra) TypeError: an integer is required

4

3 Answers

PIL isn't an attribute of newImg1 but newImg1 is an instance of PIL.Image so it has a save method, thus the following should work.

newImg1.save("img1.png","PNG")

Note that just calling a file .png doesn't make it one so you need to specify the file format as a second parameter.

try:

type(newImg1)
dir(newImg1)

and

help(newImg1.save)
5

As I hate to see questions without a complete answer:

from PIL import Image
newImg1 = Image.new('RGB', (512,512))
for i in range (0,511):
    for j in range (0,511):
        newImg1.putpixel((i,j),(i+j%256,i,j))
newImg1.save("img1.png")

which yields a test pattern.

To use array style addressing on the image instead of putpixel, convert to a numpy array:

import numpy as np
pixels = np.asarray(newImg1)
pixels.shape, pixels.dtype
-> (512, 512, 3), dtype('uint8')

Try this:

newImg1 = pimg.as_PIL('RGB', (512,512))
...
newImg1.save('Img1.png')

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Sarah Jenkins

Sarah Jenkins

Senior Technology Editor & AI Specialist

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.

Share this article
Twitter Facebook Pinterest