2017-02-09 122 views
1

我是新编程并尝试制作图像缩放器。我想在文件名之前让用户编写自定义前缀。尺寸也是可以定制的。cv2.resize()错误:使用不同的名称保存相同的图片

cv2.imshow()工作正常,但cv2.resize()没有。如果使用imshow检查它,尽管有for循环,它只显示一张图片,然后cv2.imwrite只保存一张带有所有选定图片名称的图片。 列表似乎没有问题。

我希望我是清楚的,代码:

def openfiles(): 

    global picture_original 
    global file_path 
    global f 

    # Valid filetypes 
    file_types=[("Jpeg files","*.jpg"),("PNG files","*.png"),("BMP files","*.bmp"),("all files","*.*")] 

    window.filenames = filedialog.askopenfilenames(initialdir = "/",title = "Select file",filetypes = (file_types)) # TUPLE of filepath/filenames 

    #f = [] 

    # Creating a list from the tuple 
    for pics in window.filenames: 
     f.append(pics) 

     f = [picture.replace('/', "\\") for picture in f] 

    try: 
     for picture in f: 
      picture_original = cv2.imread(picture, 1) 
      #cv2.imshow("Preview", picture_original) 
      #cv2.waitKey(1) 
    except: 
     msgbox_openerror() # Error opening the file 

    # Getting the filepath only from the list "f": 
    file_path = f[0].rsplit("\\",1)[0] 
    view_list() 

def save_command(): 
    """ 
    function to save the resized pictures 
    """ 
    global picture_resized 
    global prefix 
    prefix = "Resized_" 
    lst_filename = [] 
    lst_renamed = [] 

    for i in f: 
     #print(f) 
     path,filename = os.path.split(i) # path - only filepath | filename - only filename with extension 
     lst_filename.append(prefix+filename) 

    for i in range(len(f)): 
     lst_renamed.append(os.path.join(path, lst_filename[i])) 

    for i in range(len(f)): 
     picture_resized = cv2.resize(picture_original, ((int(width.get())), int(height.get()))) 
     cv2.imshow("Preview", picture_resized) 
     cv2.waitKey(1) 

    for i in lst_renamed: 
     cv2.imwrite(i, picture_resized) 

我希望有人有一些想法。先谢谢你!

+0

你有什么期望在'openfiles()'完成后包含'picture_original'? –

+0

或'picture_resized' ......循环中没有什么能够根据“i”的值调整大小 - 所以你基本上一次又一次地在相同的输入上重复相同的操作。同样,在使用'imwrite'的循环中,唯一改变的是文件名。 |如果您有多个文件名要处理(并将它们存储在列表中),则还应该有多个图像(并将它们存储在列表中)。 –

+1

我期望'picture_original'和'picture_resized'应该是numpy数组的列表。他们的类型应该是 是的,你可能是正确的与循环相关的。我尝试调整'picture_original [i]'和'imwrite'。 – koger23

回答

0

这是一个例子乘以比率来调整,并且将您的图像

def ResizeImage(filepath, newfileName,ratio): 
     image = cv2.imread(filepath)   #Open image 
     height, width = image.shape[:2]  #Shapes 
     image2 = cv2.resize(image, (width/ratio, height/ratio), interpolation = cv2.INTER_AREA) 
     cv2.imwrite(newfileName,image2)   #saves, True if OK 
     return filepath 

所以,如果你

image = "originalpath" 
resized = ResizeImage(image,"Resized_"+image,2) 
newImage = cv2.imread(resized) 
cv2.imshow("new",newImage) 
cv2.waitKey(1) 

你应该让你的图片一半大小

+0

你的回答是部分正确的,但是如果他们试图按照“原样”运行你的代码,它还不能作为其他例子。请阅读问题OP再次结合注释a nd相应地修改你的答案,直到完整的工作答案。只有这样你才能得到我的最高票数。审查结束。 – ZF007

相关问题