I have a program that is supposed to convert an image to a squared png with transparent borders (if the image is 1000x1500 then the png is 1500x1500 and then the image will be placed on the middle of the png creating a transparent border of 250x1500 on both sides). The program is supposed to import the image from a folder which I you can choose which you wish to import from, and then export it to another folder that you can also choose. I use recursion to go throw all images from the folder, however it says that the input is not recognizable. Can anyone help me with this one? You have everything you need explained on the code I'll send right now:
from PIL import Image
from os import listdir
from os.path import isfile, join,splitext
Folder_Input = 'D:\\0Pi_\Downloads\ScpServer\Originais' #directory where we will upload images
Folder_Output ='D:\\0Pi_\Downloads\ScpServer\PNGs' #directory where we will save images
typelist = ['.png','.jpg','.jpeg']
images_list = [f for f in listdir(Folder_Input) if isfile(join(Folder_Input, f)) and splitext(f)[1].lower() in typelist]
for im in images_list:
try:
image = Image.open(im) #this is supposed to open the image, however it doesn't. what's missing
except:
print(f'Problem opening image{im}!\n')
image.close()
continue
width, height = image.size
if height >= width:
new_width = height
new_height = height
else:
new_width = width
new_height = width
result = Image.new(mode = 'RGBA', size = (new_width, new_height) ,color = (0,0,0,0)) #creates a new transparent squared png
offset = ((new_width - width) // 2, (new_height - height) // 2) #centers the image in relation to the squared png
result.paste(image,offset) #unites both the image and the squared layer
image.close() #closes the file now finished
output_file = join(Folder_Output,splitext(im)[0] + '.png')
if not isfile(output_file):
result.save(output_file) #saves file on the output folder
else:
print(f"The file {splitext(im)[0] + '.png'} was not saved because it already exists on {Folder_Output}!\n")
This is the Tracebak:
Traceback (most recent call last):
File "D:/0Pi_/Documents/add_borders.py", line 16, in <module>
image.close()
builtins.NameError: name 'image' is not defined
If the try/except block fails, it may not have assigned the object to the image variable.
try:
image = Image.open(im) # this is supposed to open the image, however it doesn't. what's missing
except:
print(f'Problem opening image{im}!\n')
image.close() # will have problem here
Since, you are looking only to the Image.open(im) if it was succeed, just remove image.close() from the except or, use another try/except to close the object. Maybe the im is not readable or have a wrong path, so that will cause to fail.
Related
I want to achieve coordinates using the last four numbers (which represent center and dimensions of bounding box) and crop the bounding box from the image with the same name (.jpg format).
I have written the following code:
import os
from PIL import Image
from os import listdir
directory = "/home/masoud/masoud/crop/obj"
for file in os.listdir(directory):
if file.endswith(".txt"):
with open(os.path.join(directory, file), 'r') as f:
for line in f: # changed to file handle
line = line.rstrip() # remove trailing '\n'
nums = line.split()
four_nums = nums[1:5]
# print(four_nums)
image_name = os.path.splitext(os.path.join(directory, file)[0]+'.jpg'
img = Image.open(os.path.join(directory, image_name))
width, height = img.size
# # Setting the points for cropped image
left = width * (nums[1]- nums[3]/2)
top = height * (nums[2]- nums[4]/2)
right = width * (nums[1]+ nums[3]/2)
bottom = height * (nums[2]+ nums[4]/2)
# # Cropped image of above dimension
# # (It will not change orginal image)
im_cropped = img.crop((left, top, right, bottom))
im_cropped.show()
im_cropped.save('/home/masoud/masoud/crop/cropped-images', 'JPEG')
else:
continue
and txt files contents looks like below:
0 0.3547 0.5096 0.7293 1.0258
but I am getting the following syntax error.
File "/home/masoud/masoud/crop/crop.py", line 18
img = Image.open(os.path.join(directory, image_name))
^
SyntaxError: invalid syntax
[Finished in 0.4s with exit code 1]
[cmd: ['/home/masoud/anaconda3/bin/python3', '-u', '/home/masoud/masoud/crop/crop.py']]
[dir: /home/masoud/masoud/crop]
[path: /home/masoud/bin:/home/masoud/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin]
also directories look like this:
directories
You should use some IDE having a syntax check, like PyCharm CE,
not the line 18, but line 17 is the problem:
You are missing the closing bracket ")"
image_name = os.path.splitext(os.path.join(directory, file)[0]+'.jpg'
i assume you want:
image_name = os.path.splitext(os.path.join(directory, file))[0]+'.jpg'
I'm new to code. So, to be honest, I dont know what I do wrong here
import os
from PIL import Image
SQUARE_FIT_SIZE = 900
LOGO_FILENAME = "24h.png"
logo = Image.open(LOGO_FILENAME)
logoWidth, logoHeight = logo.size
os.makedirs("withLogo", exist_ok=True)
path = "/Users/mac/Desktop/水/71"
for filename in os.listdir("path"):
if not (filename.endswith('.png') or filename.endswith('.jpg')) \
or filename == LOGO_FILENAME:
im = Image.open(filename)
width, height = im.size
if width > SQUARE_FIT_SIZE and height > SQUARE_FIT_SIZE:
if width>height:
height = int((SQUARE_FIT_SIZE / width) * height)
width = SQUARE_FIT_SIZE
else:
width = int((SQUARE_FIT_SIZE / height) * width)
height = SQUARE_FIT_SIZE
print('Resizing %s...' % (filename))
im = im.resize((width, height))
print('Adding logo to %s...' % filename)
im.paste(logo, (width - logoWidth, height - logoHeight), logo)
im.save(os.path.join('withLogo', filename))
I expect the output will be a folder of added logo and resized images, but nothing happens as the code doesnt work.
You have two problems with your code:
You are using relative paths. So instead of
os.makedirs("withLogo", exist_ok=True)
path = "/Users/mac/Desktop/水/71"
reverse the order of the statements and use an absolute path for makedirs:
path = "/Users/mac/Desktop/水/71"
target_path=os.path.join(path, "withLogo")
os.makedirs(target_path, exist_ok=True)
I also added a new variable target_path that you can use later when you save your image:
im.save(os.path.join(target_path, filename))
If you are using relative paths your current working directory is used as root for all these operations.
You are using a string instead of a variable:
for filename in os.listdir("path"):
No need for quotes here, so this is easy to fix:
for filename in os.listdir(path):
With these hints it should be easy for you to fix your code.
The problem is that the last 3 lines:
print('Adding logo to %s...' % filename)
im.paste(logo, (width - logoWidth, height - logoHeight), logo)
im.save(os.path.join('withLogo', filename))
are not indented properly. They should be inside of the for loop (4 spaces or 1 tab over). Instances of the images that the logo is being pasted on are defined within the for loop with im = Image.open(filename), so since im.paste and im.save are called outside of the loop, they're referencing something that doesn't exist.
I already saw the examples suggested but some of them don't work.
So, I have this code which seems to work fine for one image:
im = Image.open('C:\\Users\\User\\Desktop\\Images\\2.jpg') # image extension *.png,*.jpg
new_width = 1200
new_height = 750
im = im.resize((new_width, new_height), Image.ANTIALIAS)
im.save('C:\\Users\\User\\Desktop\\resized.tif') # .jpg is deprecated and raise error....
How can I iterate it and resize more than one image ? Aspect ration need to be maintained.
Thank you
# Resize all images in a directory to half the size.
#
# Save on a new file with the same name but with "small_" prefix
# on high quality jpeg format.
#
# If the script is in /images/ and the files are in /images/2012-1-1-pics
# call with: python resize.py 2012-1-1-pics
import Image
import os
import sys
directory = sys.argv[1]
for file_name in os.listdir(directory):
print("Processing %s" % file_name)
image = Image.open(os.path.join(directory, file_name))
x,y = image.size
new_dimensions = (x/2, y/2) #dimension set here
output = image.resize(new_dimensions, Image.ANTIALIAS)
output_file_name = os.path.join(directory, "small_" + file_name)
output.save(output_file_name, "JPEG", quality = 95)
print("All done")
Where it says
new_dimensions = (x/2, y/2)
You can set any dimension value you want
for example, if you want 300x300, then change the code like the code line below
new_dimensions = (300, 300)
I assume that you want to iterate over images in a specific folder.
You can do this:
import os
from datetime import datetime
for image_file_name in os.listdir('C:\\Users\\User\\Desktop\\Images\\'):
if image_file_name.endswith(".tif"):
now = datetime.now().strftime('%Y%m%d-%H%M%S-%f')
im = Image.open('C:\\Users\\User\\Desktop\\Images\\'+image_file_name)
new_width = 1282
new_height = 797
im = im.resize((new_width, new_height), Image.ANTIALIAS)
im.save('C:\\Users\\User\\Desktop\\test_resize\\resized' + now + '.tif')
datetime.now() is just added to make the image names unique. It is just a hack that came to my mind first. You can do something else. This is needed in order not to override each other.
I assume that you have a list of images in some folder and you to resize all of them
from PIL import Image
import os
source_folder = 'path/to/where/your/images/are/located/'
destination_folder = 'path/to/where/you/want/to/save/your/images/after/resizing/'
directory = os.listdir(source_folder)
for item in directory:
img = Image.open(source_folder + item)
imgResize = img.resize((new_image_width, new_image_height), Image.ANTIALIAS)
imgResize.save(destination_folder + item[:-4] +'.tif', quality = 90)
I am using the following code to read multiple images from a folder and to take a specific crop from all of them and also write them at the end. The cropping part does not seem to work meaning the cropped parts are not getting written.
# import the necessary packages
import cv2
import os, os.path
#image path and valid extensions
imageDir = "C:\\Users\\Sayak\\Desktop\\Training\\eye\\1" #specify your path here
image_path_list = []
valid_image_extensions = [".jpg", ".jpeg", ".png", ".tif", ".tiff"] #specify your vald extensions here
valid_image_extensions = [item.lower() for item in valid_image_extensions]
#create a list all files in directory and
#append files with a vaild extention to image_path_list
for file in os.listdir(imageDir):
extension = os.path.splitext(file)[1]
if extension.lower() not in valid_image_extensions:
continue
image_path_list.append(os.path.join(imageDir, file))
#loop through image_path_list to open each image
for imagePath in image_path_list:
image = cv2.imread(imagePath)
# display the image on screen with imshow()
# after checking that it loaded
if image is not None:
cv2.imshow(imagePath, image)
elif image is None:
print ("Error loading: " + imagePath)
#end this loop iteration and move on to next image
continue
crop_img = image[200:400, 100:300]
cv2.imwrite('pic{:>05}.jpg'.format(imagePath), crop_img)
# wait time in milliseconds
# this is required to show the image
# 0 = wait indefinitely
# exit when escape key is pressed
key = cv2.waitKey(0)
if key == 27: # escape
break
# close any open windows
cv2.destroyAllWindows()
I have modified your code posted above. The problem lies with your string formatting used in cv2.imwrite(). The first argument must be an absolute path to where the file should be saved, but your code is passing in something like this.
pic{:>05}.jpg => pic/home/ubuntu/Downloads/10_page.png.jpg. When I used a valid file name there is no problem saving the cropped image at all.
#loop through image_path_list to open each image
for i,imagePath in enumerate(image_path_list):
image = cv2.imread(imagePath)
# display the image on screen with imshow()
# after checking that it loaded
if image is not None:
cv2.imshow(imagePath, image)
elif image is None:
print ("Error loading: " + imagePath)
#end this loop iteration and move on to next image
continue
# Please check if the size of original image is larger than the pixels you are trying to crop.
(height, width, channels) = image.shape
if height >= 400 and width >= 300:
plt.imshow(image)
plt.title('Original')
plt.show()
crop_img = image[100:400, 100:400]
# Problem lies with this path. Ambiguous like pic/home/ubuntu/Downloads/10_page.png.jpg
print('pic{:>05}.jpg'.format(imagePath))
# Try a proper path. A dirname + file_name.extension as below, you will have no problem saving.
new_image = os.path.join(imageDir,'{}.png'.format(str(i)))
cv2.imwrite(new_image, crop_img)
plt.imshow(crop_img)
plt.title('Cropped')
plt.show()
New to coding and don't understand the error I am getting. Included below is my code and the traceback:
import PIL
import matplotlib.pyplot as plt # single use of plt is commented out
import os.path
import PIL.ImageDraw
import PIL
from PIL import ImageFont
from PIL import Image
from PIL import ImageDraw
def round_corners(original_image, percent_of_side):
""" Rounds the corner of a PIL.Image
original_image must be a PIL.Image
Returns a new PIL.Image with rounded corners, where
0 < percent_of_side < 1
is the corner radius as a portion of the shorter dimension of original_image
"""
font = ImageFont.truetype("arial.ttf", 15)
# Opening the file gg.png
imageFile = ("new.jpg")
im1=Image.open(imageFile)
# Drawing the text on the picture
draw = ImageDraw.Draw(im1)
draw.text((0,0), "SAMSUNG",(0,0,255),font=font)
im1.save("marked_image.png")
#set the radius of the rounded corners
width, height = original_image.size
radius = int(percent_of_side * min(width, height)) # radius in pixels
###
#create a mask
###
#start with transparent mask
rounded_mask = PIL.Image.new('RGBA', (width, height), (127,0,127,0))
drawing_layer = PIL.ImageDraw.Draw(rounded_mask)
# Overwrite the RGBA values with A=255.
# The 127 for RGB values was used merely for visualizing the mask
# Draw two rectangles to fill interior with opaqueness
drawing_layer.polygon([(radius,0),(width-radius,0),
(width-radius,height),(radius,height)],
fill=(127,0,127,255))
drawing_layer.polygon([(0,radius),(width,radius),
(width,height-radius),(0,height-radius)],
fill=(127,0,127,255))
#Draw four filled circles of opaqueness
drawing_layer.ellipse((0,0, 2*radius, 2*radius),
fill=(0,127,127,255)) #top left
drawing_layer.ellipse((width-2*radius, 0, width,2*radius),
fill=(0,127,127,255)) #top right
drawing_layer.ellipse((0,height-2*radius, 2*radius,height),
fill=(0,127,127,255)) #bottom left
drawing_layer.ellipse((width-2*radius, height-2*radius, width, height),
fill=(0,127,127,255)) #bottom right
# Uncomment the following line to show the mask
# plt.imshow(rounded_mask)
# Make the new image, starting with all transparent
result = PIL.Image.new('RGBA', original_image.size, (0,0,0,0))
result.paste(original_image, (0,0), mask=rounded_mask)
return result
def get_images(directory=None):
""" Returns PIL.Image objects for all the images in directory.
If directory is not specified, uses current directory.
Returns a 2-tuple containing
a list with a PIL.Image object for each image file in root_directory, and
a list with a string filename for each image file in root_directory
"""
if directory == None:
directory = os.getcwd() # Use working directory if unspecified
image_list = [] # Initialize aggregaotrs
file_list = []
directory_list = os.listdir(directory) # Get list of files
for entry in directory_list:
absolute_filename = os.path.join(directory, entry)
try:
image = PIL.Image.open(absolute_filename)
file_list += [entry]
image_list += [image]
except IOError:
pass # do nothing with errors tying to open non-images
return image_list, file_list
def round_corners_of_all_images(directory=None):
""" Saves a modfied version of each image in directory.
Uses current directory if no directory is specified.
Places images in subdirectory 'modified', creating it if it does not exist.
New image files are of type PNG and have transparent rounded corners.
"""
if directory == None:
directory = os.getcwd() # Use working directory if unspecified
# Create a new directory 'modified'
new_directory = os.path.join(directory, 'modified')
try:
os.mkdir(new_directory)
except OSError:
pass # if the directory already exists, proceed
#load all the images
image_list, file_list = get_images(directory)
#go through the images and save modified versions
for n in range(len(image_list)):
# Parse the filename
filename, filetype = file_list[n].split('.')
# Round the corners with radius = 30% of short side
new_image = round_corners(image_list[n],.30)
#save the altered image, suing PNG to retain transparency
new_image_filename = os.path.join(new_directory, filename + '.png')
new_image.save(new_image_filename)
There is the full code and here is the traceback:
IOError Traceback (most recent call last)
<ipython-input-19-8a0b83840aa4> in <module>()
----> 1 round_corners_of_all_images()
C:\Users\ewainscott2019\Desktop\Computer Science\Semester 2\Image Artist\Image Artist Code.py in round_corners_of_all_images(directory)
124
125 # Round the corners with radius = 30% of short side
--> 126 new_image = round_corners(image_list[n],.30)
127 #save the altered image, suing PNG to retain transparency
128 new_image_filename = os.path.join(new_directory, filename + '.png')
C:\Users\ewainscott2019\Desktop\Computer Science\Semester 2\Image Artist\Image Artist Code.py in round_corners(original_image, percent_of_side)
20 # Opening the file gg.png
21 imageFile = ("new.jpg")
---> 22 im1=Image.open(imageFile)
23
24 # Drawing the text on the picture
C:\Users\ewainscott2019\AppData\Local\Enthought\Canopy\User\lib\site-packages\PIL\Image.pyc in open(fp, mode)
2270 filename = str(fp.resolve())
2271 if filename:
-> 2272 fp = builtins.open(filename, "rb")
2273
2274 try:
IOError: [Errno 2] No such file or directory: 'Phone_1.jpg'
I don't understand my error I have in the code. I have tried receiving help elsewhere but cannot find out anything. This is a school project that is overdue and I need to get it done.