pillow(PIL)图片resize方向后会自动旋转问题_pil resize旋转-程序员宅基地

技术标签: 问题解决  

使用方法:拷贝至python代码,放于图片上一层目录,运行。代码为按图像比例调节。通过设置横宽,高度会自动调节,目标横宽设置为代码第七行width
图片自动旋转原因是手机拍摄时记录了拍摄方向,信息记录在图片的exif内,resize后便自动调整了方向,通过读取exif信息,反向操作实现resize后方向不变。

这个代码是在pascalvoc格式标注图片后,已经生成xml文件后调整图片大小,若xml文件与图片置于相同文件夹下,在调整图片大小后也会对应改变xml文件中的标注信息

# -*- coding: UTF-8 -*-
import os
from PIL import Image
import exifread
import sys
import xml.etree.ElementTree as ET
import math
width_aim =550 # 调整后图片的目标尺寸
# width_aim = int(input("请输入您要调整到的图片宽度:"))

if __name__ == "__main__":
    wd = os.getcwd()  # 获取当前文件目录
    dir_list = os.listdir(wd)
    dir_pic = []

    for item in dir_list:
        if os.path.isdir(item):
            # dir.append(item)
            dir_path = os.path.join(wd, item)
            dir_list_temp = os.listdir(dir_path)
            for item2 in dir_list_temp:
                if os.path.isfile(dir_path.replace('\\', '/') + '/' + item2):
                    try:
                        if item2.split('.')[1] == 'jpg' or item2.split('.')[1] == 'JPG':
  
                            dir_pic.append(dir_path + '/' + item2)  # 此处搜集完所有图片文件路径名称放在dir中
                    except:
                        pass


    for item in dir_pic:
        # *****hahaha, 这一小段是整来耍的
        sys.stdout.write('\r' + '/')
        sys.stdout.flush()
        sys.stdout.write('\r' + '|')
        sys.stdout.flush()
        sys.stdout.write('\r' + '\\')
        sys.stdout.flush()
        # print('\r'+'你的输出详情', flush=True)

        f = open(item, 'rb')
        tags = exifread.process_file(f)
        need_ori_L = 0
        need_ori_R = 0
        need_ori_180 = 0
        if 'Image Orientation' in tags.keys():
            if 'Rotated' in str(tags['Image Orientation']):
                if 'Rotated 90 CW' in str(tags['Image Orientation']): # right, top
                    need_ori_L = 1
                elif 'Rotated 90 CCW' in str(tags['Image Orientation']): # left, bottom
                    need_ori_R = 1
                elif 'Rotated 180' in str(tags['Image Orientation']): #
                    need_ori_180 = 1

                # 还有Horizontal(normal)为正常情况

                # 还有些情况未考虑到, 比如镜像等, 由于数量少,就偷个懒暂时忽略了

        f.close()

        # 有的图片中exif信息有orientation会影响图片方向, 下面代码用于解决该问题
        img = Image.open(item)

        if need_ori_L == 1:
            img = img.transpose(Image.ROTATE_270)
        elif need_ori_R == 1:
            img = img.transpose(Image.ROTATE_90)
        elif need_ori_180 == 1:
            img = img.transpose(Image.ROTATE_180)

        w, h = img.size
        h_temp = int(h * (width_aim / w))
        image = img.resize((width_aim, h_temp))
        image.save(item)
      # 对应调整图片xml文件中size

        # 调整xml文件
        try:
            updateTree = ET.parse(item.split('.')[0] + '.xml')
            # updateTree = ET.parse('C:/Users/DELL/Desktop/garbage-detec/images/IMG_20210327_105059.xml')
            root = updateTree.getroot()

            size = root.find('size')
            width = size.find('width')
            height = size.find('height')

            width_original = int(width.text)
            height_original = int(height.text)

            width_changed = width_aim
            height_changed = int(height_original * (width_changed / width_original))

            width.text = str(width_changed)
            height.text = str(height_changed)

            # objects = root.getElementsByTagName("object")
            objects = []
            for item2 in root:
                if item2.tag =='object':
                    objects.append(item2)


            for object in objects:
                bndbox = object.find('bndbox')
                xmin = bndbox.find('xmin')
                ymin = bndbox.find('ymin')
                xmax = bndbox.find('xmax')
                ymax = bndbox.find('ymax')

                xmin.text = str(math.ceil((width_changed / width_original) * int(xmin.text)))
                ymin.text = str(math.ceil((height_changed / height_original) * int(ymin.text)))
                xmax.text = str(math.ceil((width_changed / width_original) * int(xmax.text)))
                ymax.text = str(math.ceil((height_changed / height_original) * int(ymax.text)))

            updateTree.write(item.split('.')[0] + '.xml', encoding = "UTF-8")
        except:
            pass
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ohhardtoname/article/details/115290862

智能推荐

Ubuntu虚拟机总是死机,然后重启就进不去打不开了怎么办_ubuntu卡死之后重启,打不开了-程序员宅基地

文章浏览阅读4.6k次。从网上搜到的方法都解决不了我的问题,分享一点我自己的实在的解决经验:养成保存快照的习惯,比什么方法都靠谱。 即打开VMWare->虚拟机->快照->拍摄快照,简单填写一下你现在做到的程度,然后点击拍摄快照,存一下,养成习惯,每做出些什么东西了,就存一个快照,哪天莫名其妙又死机了,开机又黑屏进不去了,直接用快照恢复到最近的进度继续做就好。..._ubuntu卡死之后重启,打不开了

LDR6028乐得瑞OTG充电直播数据方案-程序员宅基地

文章浏览阅读51次。随着type-c接口越来越普及,手机逐渐取消了3.5mm耳机接口,只留一个多功能type-c接口,这使得3.5mm有线耳机的用户多少有些不习惯,那为什么他们不选择使用无线耳机,笔者分析认为有以下几种原因:价格,有线耳机相比于无线耳机便宜,当然有线耳机也有昂贵品牌,这也是原来用户一直不舍得换的原因。音质,有线耳机确实比不少无线耳机音质要更好(估计是有线耳机不用考虑供电问题,耳机喇叭能做更高的功率,无线耳机因为要考虑电池续航,耳机喇叭要控制电量损耗,没法做更高的规格)。

Netty专题-程序员宅基地

文章浏览阅读147次。1.Netty是什么面试官:介绍一下自己对netty的认识吧!小伙砸~我:好的!我就用简单的几点来概括下netty吧Netty 是一个基于NIO 的 client-server(客户端服务端框架),使用它可以快速简单第开发网络应用程序。它极大地简化并优化了TCP和UDP套接字服务器等网络编程,并且性能以及安全性等很多方面甚至都要更好。支持多种协议 如FTP,SMTP,HTTP以及各种二进制和基于文本的传统协议。用官方的总结就是:Netty 成功地找到了一种在不妥协可维护和性能的情况下实现易于_netty专题

六个office免费学习的精品教程 office自学教程让你从小白到高手-程序员宅基地

文章浏览阅读4.4k次。今天给大家分享六个免费学习的精品教程,包括了word,ppt,excel常用的办公三剑客,学会这三个让你办公无忧,也能让你靠这些技术找到一份好工作,这些office自学教程让你从小白到高手。一.PPT零基础入门教程PPT教程PPT零基础,PPT入门小白脱白系列,让你从做PPT的小白到高手,职场无敌。学习地址为:https://www.bilibili.com/video/av1205327...

OpenGL 创建窗口/三角形VAO、VBO、EBO_opengl bao-程序员宅基地

文章浏览阅读963次,点赞3次,收藏7次。Day 1 使用OpenGL创建三角形程序运行效果VAO vertex array object 顶点数组对象VBO vertex buffer object 顶点缓冲对象EBO element(index) buffer object 索引缓冲对象VBO and VAOData Flow from CPU to GPUVertex Buffer Object (VBO)VBO..._opengl bao

缓存雪崩、缓存穿透、缓存击穿-程序员宅基地

文章浏览阅读1.1k次,点赞28次,收藏24次。当然,可能针对缓存穿透的情况,也有可能是其他的原因引起,可以针对具体情况,采用对应的措施。缓存击穿,就是说某个 key 非常热点,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。undefined 缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。2缓存失效:缓存中的某些数据过期或者被淘汰,在数据重新加载到缓存之前,大量请求会直接穿透到存储系统中查询,导致存储系统负载剧增。

随便推点

6.3.2Transmit OFF power——翻译_transmit on/off power-程序员宅基地

文章浏览阅读1k次。1、测试目的为了验证UE发射OFF功率低于测试要求中指定的值。过大的发射OFF功率可能会增加反向干扰(RoT),因此会减少其他UE的小区覆盖范围。2、测试适用性此测试适用于所有类型的NR UE版本15及更高版本。 注意:当前,此测试用例只能支持Band n257和PC3。3、测试说明1、初始条件初始条件是需要测试UE的一组测试配置,以及SS与UE一起采取的步骤以达到正确的测量状态。初始测试配置包括环境条件,测试频率,测试信道带宽和基于表5.3.5-1中指定的NR工作频带的子._transmit on/off power

Manjaro安装一款好用的截图工具Deepin-screenshot_manjaro dwm窗口下好用的截图软件-程序员宅基地

文章浏览阅读7.3k次,点赞2次,收藏7次。效果图安装yaourt deepin-screenshot自定义快捷键截图配置设置--->设备   keyboard--------> 新建快捷键-->点击+号 使用:直接点一下键盘上的截屏键即可:PrtSc(是个缩写) ..._manjaro dwm窗口下好用的截图软件

网易云音乐移动端项目实战(分解上),2024年最新学it主要学什么-程序员宅基地

文章浏览阅读537次,点赞9次,收藏11次。/获取歌单的详情api 下的index.js//获取轮播图API/*0: pc1: android2: iphone3: ipad*///获取推荐歌单默认十条数据//获取歌单的详情router 下的index.jspath: ‘/’,},},routes})views下的listview.vue。

Intellij IDEA--生成UML类图的方法_intellij idea生成java uml-程序员宅基地

文章浏览阅读3.1k次。本文介绍Idea如何生成UML类图。_intellij idea生成java uml

idea识别不到maven下载的jar_idea maven有jar包却不能识别-程序员宅基地

文章浏览阅读963次。Maven初级问题_idea maven有jar包却不能识别

珞珈一号数据预处理完整流程及一些总结_arcgis滤波器在哪里-程序员宅基地

文章浏览阅读7.2k次,点赞18次,收藏65次。珞珈一号的噪声噪点什么的都非常多,想要去噪声个人总结出了很多方法:1.arcgis滤波器(空间分析工具——邻域分析——滤波器:低通滤波)2.envi低通滤波(同上面的工具,特点是可以平滑图像减少噪声同时会减少细节)3.利用自然间断点分级法来进行灯光分级(级别越多越好,分的越细,阈值也就更加精确),分级后从中选择适合的灯光值作为阈值以去除噪声4.老方法(不变目标区域法):选择同年同月份的npp影像,默认npp影像上DN值为0的地方在珞珈一号DN值也为0,以此作为掩膜去剔除噪声…(方法很多,仅供参考)_arcgis滤波器在哪里

推荐文章

热门文章

相关标签