[UG 二次开发 python] 生成略缩图并保存
保存到零件同名的文件夹下,名称相同,类型是 jpg
用到 numpy,PIL,cv2
blockstyler 文件略
# nx: threaded
__version__ = "0.0.1"
__author__ = "unmht"
__blog__ = "https://www.cnblogs.com/unm001/"
from dlx.截图制作 import 截图制作
import os
import NXOpen
import NXOpen.BlockStyler
import NXOpen.UF
import cv2
import numpy as np
from PIL import Image
from support import info
os.chdir(os.path.dirname(os.path.abspath(__file__)))
class myclass(截图制作):
dwa: NXOpen.BlockStyler.DrawingArea
bt0: NXOpen.BlockStyler.Button
bt1: NXOpen.BlockStyler.Button
def __init__(self):
super().__init__()
self.work = self.theSession.Parts.Work
self.partpath = self.work.FullPath
self.dirpath = os.path.dirname(self.partpath)
self.imgpath = os.path.join(self.dirpath, f"{self.work.Name}.jpg")
self.readimgok = False
self.tmpimg = os.path.join(self.dirpath, "_tmp.jpg")
self.imgdata = None
if os.path.exists(self.tmpimg):
os.remove(self.tmpimg)
def dialogShown_cb(self):
try:
if os.path.exists(self.imgpath):
self.dwa.Image = self.imgpath
self.readimgok = True
except Exception as ex:
self.theUI.NXMessageBox.Show(
"Block Styler", NXOpen.NXMessageBox.DialogType.Error, str(ex)
)
def update_cb(self, block):
try:
if block == self.dwa:
# ---- Enter your code here -----
pass
elif block == self.bt0:
if self.imgdata is not None:
cv2.imencode(".jpg", self.imgdata)[1].tofile(self.imgpath)
elif block == self.bt1:
r = False
try:
r = self.capture()
except Exception as e:
info(e)
if r:
self.dwa.Image = self.tmpimg
except Exception as ex:
# ---- Enter your exception handling code here -----
self.theUI.NXMessageBox.Show(
"Block Styler", NXOpen.NXMessageBox.DialogType.Error, str(ex)
)
return 0
def capture(self):
self.imgdata = None
imgbuilder = self.theUI.CreateImageExportBuilder()
imgbuilder.RegionMode = False
imgbuilder.FileFormat = NXOpen.Gateway.ImageExportBuilder.FileFormats.Jpg
imgbuilder.FileName = self.tmpimg
imgbuilder.BackgroundOption = (
NXOpen.Gateway.ImageExportBuilder.BackgroundOptions.CustomColor
)
imgbuilder.SetCustomBackgroundColor([1.0, 1.0, 1.0])
imgbuilder.EnhanceEdges = True
imgbuilder.Commit()
imgbuilder.Destroy()
if os.path.exists(self.tmpimg):
img = Image.open(self.tmpimg)
img.load()
imgtmp = np.asanyarray(img)
img.close()
os.remove(self.tmpimg)
imgtmp = cv2.cvtColor(imgtmp, cv2.COLOR_RGB2BGR)
imggray = cv2.cvtColor(imgtmp, cv2.COLOR_BGR2GRAY)
imggray = 255 - imggray
cts, hirs = cv2.findContours(
imggray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE
)
ct = max(cts, key=cv2.contourArea)
rct = cv2.boundingRect(ct)
x, y, width, height = rct
imgCut = imgtmp[y : y + height, x : x + width]
h2 = int(max(width * 2 / 3, height) + 0.1) + 4
if h2 % 2 == 1:
h2 = h2 + 1
if h2 % 4 != 0:
h2 = h2 + 2
w2 = int(h2 * 1.5)
dw = int((w2 - width) / 2)
dh = int((h2 - height) / 2)
imgret = np.full((h2, w2, 3), 255).astype(np.uint8)
# info([imgCut.shape, imgret.shape])
imgret[dh : dh + height, dw : dw + width] = imgCut
# info([width, height, w2, h2, dw, dh])
imgret2 = cv2.resize(imgret, (320, 240))
cv2.imencode(".jpg", imgret2)[1].tofile(self.tmpimg)
self.imgdata = imgret2
return True
def main():
thecls: myclass
try:
thecls = myclass()
# The following method shows the dialog immediately
thecls.Show()
except Exception as ex:
# ---- Enter your exception handling code here -----
NXOpen.UI.GetUI().NXMessageBox.Show(
"Block Styler", NXOpen.NXMessageBox.DialogType.Error, str(ex)
)
finally:
try:
if thecls != None:
if os.path.exists(thecls.tmpimg):
os.remove(thecls.tmpimg)
if thecls != None:
thecls.Dispose()
thecls = None
except Exception as e:
pass
if __name__ == "__main__":
main()


[UG 二次开发 python] 生成略缩图并保存的更多相关文章
- java自动生成略缩图
当你要做一个图库的项目时,对图片大小.像素的控制是首先需要解决的难题. 本篇文章,在前辈的经验基础上,分别对单图生成略缩图和批量生成略缩图做个小结. 一.单图生成略缩图 单图经过重新绘制,生成新的图片 ...
- php 制作略缩图
一.需求 最近公司的项目中有个需求,就是用户上传自己的微信二维码,然后系统会自动将用户的微信二维码合并到产品中 二.分析 因为该系统是手机端的,所以从用户端的体验出发,用户当然是直接在微信上保存二维码 ...
- Bootstrap-CL:略缩图
ylbtech-Bootstrap-CL:略缩图 1.返回顶部 1. Bootstrap 缩略图 本章将讲解 Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstr ...
- appium-desktop录制脚本二次开发,生成我司自动化脚本
目的 通过对appium-desktop脚本录制功能进行二次开发,使录制的java脚本符合我司自动化框架要求. 实现步骤 1.增加元素名称的输入框 由于ATK(我司自动化测试框架)脚本中元素是以“ap ...
- 【转】Jenkins 二次开发 - Python
马克,备用: Jenkins 二次开发 https://testerhome.com/topics/14988?locale=zh-TW python-jenkins api 文档:https://p ...
- python生成组织架构图(网络拓扑图、graph.editor拓扑图编辑器)
Graph.Editor是一款基于HTML5技术的拓补图编辑器,采用jquery插件的形式,是Qunee图形组件的扩展项目,旨在提供可供扩展的拓扑图编辑工具, 拓扑图展示.编辑.导出.保存等功能,此外 ...
- Python生成GIF动态图
python生成摸头GIF 本篇教程演示了如何使用python的PIL库生成GIF图片 源码已经贴在文中,自行取用 效果演示 运行代码,会让你选择要制作的图片 运行完成后,会在同路径下生成dem.gi ...
- UG二次开发-CAM-获取修改路径参数
项目中要获取路径参数,网上大多是C++的例子,而本项目是用C#写的,探索了下,记录下. 以获取某条路径的刀具号为例,其他参数依此类推. using System; using System.Colle ...
- sitemap.xml 静态和动态生成页面 shopnc二次开发 动态生成sitemap.xml
Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页.最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间.更改的 ...
- 【UG二次开发】获取系统信息UF_ask_system_info
获取系统信息可以使用这个函数UF_ask_system_info 下面是例子: 1 extern DllExport void ufsta(char *param, int *returnCode, ...
随机推荐
- PostgreSQL世界上最先进的开源关系型数据库
PostgreSQL 的 Slogan 是 "世界上最先进的开源关系型数据库". PostgreSQL是一个功能非常强大.源代码开放的对象关系数据库系统(ORDBMS),在灵活的B ...
- 推荐几款火爆的Python在线编辑器
在当今数字化时代,编程已成为一项不可或缺的技能.Python作为一种简单易学且功能强大的编程语言,受到了广大编程爱好者和专业开发人员的青睐.为了方便大家随时随地编写和运行Python代码,市面上涌现了 ...
- AIRIOT答疑第3期|如何使用物联网平台的可视化组态引擎?
丰富组件,满足千人千面! AIRIOT物联网低代码平台的可视化组态引擎,具备丰富的可视化看板及组件,满足各类工艺流程图.数据可视化需求.支持三维编辑.图形绘制.图表设计等设计方式,PPT模式设计软件界 ...
- Python作图三维等高面
技术背景 对于等高线,大家都是比较熟悉的,因为日常生活中遇到的山体和水面,都可以用一系列的等高线描绘出来.而等高面,顾名思义,就是在三维空间"高度一致"的曲面.当然了,在二维平面上 ...
- Semantic Kernel入门系列:利用YAML定义prompts functions
引言 在上一章节我们熟悉了prompts functions(提示函数)的创建,我们了解了PromptTemplateConfig中各个属性的简单使用.Semantic Kernel允许我们利用多种方 ...
- 【OpenVINO™】在C#中使用 OpenVINO™ 部署 YOLOv10 模型实现目标
最近YOLO家族又添新成员:YOLOv10,YOLOv10 提出了一种一致的双任务方法,用于无nms训练的YOLOs,它同时带来了具有竞争力的性能和较低的推理延迟.此外,还介绍了整体效率-精度驱动 ...
- Android 12(S) MultiMedia Learning(二)MediaPlayer Java
Android提供了MediaPlayer这样一个简单易用的音视频java播放接口,通过几个接口调用即可实现音视频播放. 源码位置 http://aospxref.com/android-12.0.0 ...
- ReplayKit2 有线投屏项目-反向Socket实现
一.需求 我们在使用RTMP协议进行推流的时候,底层仍然采用的是TCP协议或者QUICK协议,有客户端主动发起请求.但是在有线投屏中,需要PC端向手机发起请求建立连接 二.实现 在客户端主动发起请求之 ...
- Win11安装VMware Workstation Pro,Centos,Xshell,Xftp(Linux学习需要)
注意:1.win11不能安装太低版本的VMware Workstation Pro,否则启动linux会出现蓝屏 2.win11是默认没有开虚拟机平台支持的,所以同时也要开启,否则也会出现蓝屏. ...
- 第一次线上 OOM 事故,竟和 where 1 = 1 有关
这篇文章,聊聊一个大家经常使用的编程模式 :Mybatis +「where 1 = 1 」. 笔者人生第一次重大的线上事故 ,就是和使用了类似的编程模式 相关,所以印象极其深刻. 这几天在调试一段业务 ...