python批量添加经纬度照片水印,照片水印,坐标转换

通过获取shp文件的大地2000坐标,然后转换为经纬度坐标,最后将经纬度坐标添加到照片中,实现照片添加水印,实现批量添加经纬度坐标水印。

-- coding: utf-8 --

import cv2, random
import cv2, os, sys
from PIL import ImageFont, ImageDraw, Image
import numpy as np
import shutil
from pyproj import CRS
from pyproj import Transformer
import time
import random
from osgeo import ogr
import os, sys, glob
import sys, traceback
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog, QAction
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QMessageBox

list_cmsj = {}
def yes(zm, cm, wd, jd):
global list_cmsj
path_jpg = ‘D:/path_jpg.jpg’
try:
date_rq = list_cmsj[cm]
except:
date_rq = time_factory_rz()
list_cmsj[cm] = date_rq
# 编辑图片路径
bk_img = cv2.imread(path_jpg)
sp = bk_img.shape
height = sp[0] # height(rows) of image
width = sp[1] # width(colums) of image
# 设置需要显示的字体
fontpath = “msyhl.ttc”
# 32为字体大小
font = ImageFont.truetype(fontpath, 36)
img_pil = Image.fromarray(bk_img)
draw = ImageDraw.Draw(img_pil)
# 绘制文字信息
# (100,300/350)为字体的位置,(255,255,255)为白色,(0,0,0)为黑色
draw.text((20, height-80), “备注:”, font=font, fill=(255, 255, 255))
draw.text((20, height-140), “海拔:%s米”%str(random.randint(4000, 5000)/100), font=font, fill=(255, 255, 255))
draw.text((20, height-200), “时间:%s %s”%(date_rq, time_factory_xs()), font=font, fill=(255, 255, 255))
draw.text((20, height-260), “地址:河源市紫金县%s%s”%(zm, cm), font=font, fill=(255, 255, 255))
draw.text((20, height-320), “纬度:%s”%wd, font=font, fill=(255, 255, 255))
draw.text((20, height-380), “经度:%s”%jd, font=font, fill=(255, 255, 255))
bk_img = np.array(img_pil)
cv2.imwrite(‘D:/path_jpg_x.jpg’, bk_img)

def marcator(x,y):
lonlat = {}
# CGCS2000_3_Degree_GK_Zone_40 的wkid
crs_CGCS2000 = CRS.from_epsg(4526)#4526
crs_CGCS2000 = CRS.from_wkt(‘PROJCS[“CGCS2000_3_Degree_GK_Zone_38”,GEOGCS[“GCS_China_Geodetic_Coordinate_System_2000”,DATUM[“D_China_2000”,SPHEROID[“CGCS2000”,6378137.0,298.257222101]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]],PROJECTION[“Gauss_Kruger”],PARAMETER[“False_Easting”,38500000.0],PARAMETER[“False_Northing”,0.0],PARAMETER[“Central_Meridian”,114.0],PARAMETER[“Scale_Factor”,1.0],PARAMETER[“Latitude_Of_Origin”,0.0],UNIT[“Meter”,1.0],AUTHORITY[“EPSG”,4526]]’)
#我们需要转换的目标坐标系的WKID
crs_WGS84 = CRS.from_epsg(4490)#4490
#crs_WGS84 = CRS.from_wkt(‘PROJCS[“Xian_1980_3_Degree_GK_CM_114E”,GEOGCS[“GCS_Xian_1980”,DATUM[“D_Xian_1980”,SPHEROID[“Xian_1980”,6378140.0,298.257]],PRIMEM[“Greenwich”,0.0],UNIT[“Degree”,0.0174532925199433]],PROJECTION[“Gauss_Kruger”],PARAMETER[“False_Easting”,500000.0],PARAMETER[“False_Northing”,0.0],PARAMETER[“Central_Meridian”,114.0],PARAMETER[“Scale_Factor”,1.0],PARAMETER[“Latitude_Of_Origin”,0.0],UNIT[“Meter”,1.0]]’)
from_crs = crs_CGCS2000
to_crs = crs_WGS84
transformer = Transformer.from_crs(from_crs, to_crs)
# 即为转换后的坐标,也可以分别使⽤数组
new_x, new_y = transformer.transform(x, y)
lonlat[‘x’] = new_x
lonlat[‘y’] = new_y
return new_x, new_y

def select_shp(oath_shp, list_bh):
ds = ogr.Open(oath_shp, 0)
layer = ds.GetLayer()
# featuredefn = layer.GetLayerDefn() # 获取图层属性表定义
# fieldcount = featuredefn.GetFieldCount() # 获取属性表中字段数

# for attr in range(fieldcount):
#     fielddefn = featuredefn.GetFieldDefn(attr)
#     print("%s:  %s" % ( fielddefn.GetNameRef(),fielddefn.GetFieldTypeName(fielddefn.GetType())))
#outtxtfile = open('JZX1.txt', 'w')  # 以可写方式打开
feature = layer.GetNextFeature()  # 遍历
list = {}
while feature:
    # 读取字段值
    bh = feature.GetFieldAsString('编号')
    if bh in list_bh:
        pt = feature.geometry()
        x = pt.GetX()
        if x < 1000000:
            x += 38000000
        y = pt.GetY()
        jwd = marcator(x, y)

        zm = feature.GetFieldAsString('镇')
        cm = feature.GetFieldAsString('行政村')
        list.setdefault(bh, []).append(zm)
        list.setdefault(bh, []).append(cm)
        list.setdefault(bh, []).append(jwd[0])
        list.setdefault(bh, []).append(jwd[1])
    feature.Destroy()
    feature = layer.GetNextFeature()
    # 清除DataSource缓存并关闭TXT文件
ds.Destroy()
return list

def time_factory_xs():
start_time = (2022, 4, 30, 8, 0, 0, 0, 0, 0)
end_time = (2022, 4, 30, 17, 59, 59, 0, 0, 0)
start = time.mktime(start_time) # 生成开始时间戳
end = time.mktime(end_time) # 生成结束时间戳
t = random.randint(start, end) # 在开始和结束时间戳中随机取出一个
date_touple = time.localtime(t) # 将时间戳生成时间元组
date1 = time.strftime(“%H:%M:%S”, date_touple) # 将时间元组转成格式化字符串
return date1

def time_factory_rz():
start_time = (2022, 8, 29, 8, 0, 0, 0, 0, 0)
end_time = (2022, 10, 1, 17, 59, 59, 0, 0, 0)
start = time.mktime(start_time) # 生成开始时间戳
end = time.mktime(end_time) # 生成结束时间戳
t = random.randint(start, end) # 在开始和结束时间戳中随机取出一个
date_touple = time.localtime(t) # 将时间戳生成时间元组
date2 = time.strftime(“%Y-%m-%d”, date_touple) # 将时间元组转成格式化字符串
return date2

def ye_main(self, path, path_bc, oath_shp):
list_name_jpg = os.listdir(path)
list_bh = []
for name_jpg in list_name_jpg:
a, b = os.path.splitext(name_jpg)
list_bh.append(a)
get_text(self, ‘正在获取shp信息’)
list_shp = select_shp(oath_shp, list_bh)
print(list_shp)
get_text(self, ‘开始对照片添加文字’)
jd_pl = 100 / len(list_name_jpg)
jd = 100 / len(list_name_jpg)
for name_jpg in list_name_jpg:
try:
path_jpg = os.path.join(path, name_jpg)
shutil.copy(path_jpg, ‘D:/path_jpg.jpg’)
path_bc_jpg = os.path.join(path_bc, name_jpg)
a, b = os.path.splitext(name_jpg)
shpxx = list_shp[a]
zm = shpxx[0]
cm = shpxx[1]
jd = shpxx[3]
wd = shpxx[2]
yes(zm, cm, wd, jd)
shutil.copy(‘D:/path_jpg_x.jpg’, path_bc_jpg)
get_text(self, ‘%s-成功’%name_jpg)
except:
get_text(self, ‘%s-失败’ % name_jpg)
jd = jd + jd_pl
self.progressBar.setProperty(“value”, jd)
QApplication.processEvents()
if QMessageBox.information(None, ‘提示’, “转换完成,是否打开文件夹进行查看”,
QMessageBox.Yes | QMessageBox.No) == 16384: # 给出确定与否的弹窗,是的话则下一步
os.startfile(path_bc) # 打开文件

def get_text(self, text):
self.textEdit.append(text) # 设置报错文本
QApplication.processEvents()

def main(self):
def askdirectory_word_pdf_xz():
“”“”“”
_translate = QtCore.QCoreApplication.translate
folder = QFileDialog.getExistingDirectory()
self.lineEdit.setText(_translate(“Form”, folder))

def askdirectory_word_pdf_bc():
    """"""
    _translate = QtCore.QCoreApplication.translate
    folder = QFileDialog.getExistingDirectory()
    self.lineEdit_3.setText(_translate("Form", folder))

def askdirectory():
    _translate = QtCore.QCoreApplication.translate
    folder = QFileDialog.getOpenFileName(caption='选择SHP文件', filter='Txt files(*.shp)')
    # print(folder[0])
    self.lineEdit_2.setText(_translate("Form", folder[0]))

def ye():
    try:
        get_text(self, '######################运行参数######################')
        path = self.lineEdit.text()
        oath_shp = self.lineEdit_2.text()
        path_bc = self.lineEdit_3.text()
        get_text(self, 'JPG路径:%s'%path)
        get_text(self, 'SHP路径:%s'%oath_shp)
        get_text(self, '保存路径:%s'%path_bc)
        get_text(self, '######################运行信息######################')
        ye_main(self, path, path_bc, oath_shp)
        get_text(self, '######################运行完成######################')
    except:
        get_text(self, '######################运行出错######################')
        get_text(self, traceback.format_exc())

self.toolButton.clicked.connect(askdirectory_word_pdf_xz)
self.toolButton_2.clicked.connect(askdirectory)
self.toolButton_3.clicked.connect(askdirectory_word_pdf_bc)
self.pushButton.clicked.connect(ye)

if name == ‘main’:
import jm
app = QApplication(sys.argv)
MainWindow = QMainWindow() # QMainWindow模块名
self = jm.Ui_MainWindow()
self.setupUi(MainWindow)

main(self)

MainWindow.show()
sys.exit(app.exec_())

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现给图片添加文本框输入的水印,可以通过以下步骤来实现: 1. 在Qt中创建一个新的QWidget窗口。 2. 在QWidget窗口中添加一个QLabel用于显示图片。 3. 在QLabel上叠一个QTextEdit用于输入文本。 4. 实现将QTextEdit中的文本作为水印添加到原始图片上的功能。 下面是一个简单的代码示例: ```cpp // 添加QWidget窗口 QWidget *widget = new QWidget(this); setCentralWidget(widget); // 添加QLabel用于显示图片 QLabel *label = new QLabel(widget); QPixmap pixmap("image.png"); label->setPixmap(pixmap); label->setFixedSize(pixmap.size()); // 添加QTextEdit用于输入文本 QTextEdit *textEdit = new QTextEdit(widget); textEdit->setFixedSize(200, 50); textEdit->move(10, 10); // 添加按钮,在按钮点击时将文本作为水印添加到原始图片上 QPushButton *button = new QPushButton("Add Watermark", widget); button->move(10, 70); connect(button, &QPushButton::clicked, [label, textEdit]() { QPixmap pixmap = label->pixmap()->copy(); QPainter painter(&pixmap); painter.setPen(Qt::white); painter.setFont(QFont("Arial", 20)); painter.drawText(10, 40, textEdit->toPlainText()); label->setPixmap(pixmap); }); ``` 在这个示例中,我们创建了一个QWidget窗口,并在该窗口上添加了一个QLabel用于显示图片,以及一个QTextEdit用于输入文本。当用户点击"Add Watermark"按钮时,我们将QTextEdit中的文本作为水印添加到原始图片上,并将结果显示在QLabel上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DK业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值