VB 通过COM接口解析PSD文件

最近有PS测评的需求,故而想到了解析psd文件,目的就是为了获取文档信息和图层信息;获取PS的图像信息有很多方式,有过程性的,比如监听PS的各种操作事件;有结果性的,比如本文写的解析PSD文件。

0.添加Photoshop 引用

在解决方案邮件点击添加>>引用,如下图:
在这里插入图片描述
在引用管理器中,点击COM,找到Adobe Photoshop XXX ,勾上,点击确定。
在这里插入图片描述

1.在vb文件添加导入Photoshop

在这里插入图片描述

2.解析psd

话不多说,直接上代码:


Imports Photoshop
Imports System.IOPublic Class Form1Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.LoadDim filePath As String = "D:\PhotoshopCS6操作题1\1\PS1.psd"parsePsd(filePath)End SubPrivate Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickConsole.WriteLine("ssss")Dim filePath As String = "D:\PhotoshopCS6操作题1\1\PS1.psd"parsePsd(filePath)End SubPrivate Sub parsePsd(filePath As String)Dim fileInfo As New FileInfo(filePath)Dim fileSizeInBytes As Long = fileInfo.LengthDim fileSizeInMB As Double = fileSizeInBytes / (1024 * 1024)If fileSizeInMB > 5 ThenConsole.WriteLine("文档大小[{0}MB]超过5MB", fileSizeInMB)ElseConsole.WriteLine("文档大小[{0}MB]符合要求", fileSizeInMB, fileSizeInBytes)End If' 创建Photoshop应用程序对象Dim app As New Photoshop.Application()' 打开PSD文件Dim doc As Photoshop.Document = app.Open(filePath)TryConsole.WriteLine("名称: " & doc.Name)Console.WriteLine("文档尺寸宽: " & doc.Width)Console.WriteLine("文档尺寸高: " & doc.Height)Console.WriteLine("颜色模式: " & doc.Mode.ToString)' 获取图像分辨率Dim resolution As Double = doc.ResolutionConsole.WriteLine("图像分辨率:{0} dpi", resolution)' 将宽度和高度转换为像素Dim widthInPixels As Integer = CInt((doc.Width * resolution) / 2.54)Dim heightInPixels As Integer = CInt((doc.Height * resolution) / 2.54)Console.WriteLine("图像宽度:{0} 像素", widthInPixels)Console.WriteLine("图像高度:{0} 像素", heightInPixels)' 遍历图层For Each layer As Object In doc.LayersConsole.WriteLine("0图层名称: " & layer.Name)Console.WriteLine("0图层LayerType: " & layer.Kind.ToString)Console.WriteLine("0图层Opacity: " & layer.Opacity)Console.WriteLine("0图层IsBackgroundLayer: " & layer.IsBackgroundLayer)If layer.Kind = PsLayerKind.psTextLayer ThenConsole.WriteLine("0图层文字内容: " & layer.TextItem.Contents)Console.WriteLine("0图层文字字体size: " & layer.TextItem.Size)Console.WriteLine("0图层文字字体: " & layer.TextItem.Font)' 获取文字颜色Dim textColor As SolidColor = layer.TextItem.Color' 获取颜色的分量值Dim red As Integer = textColor.RGB.RedDim green As Integer = textColor.RGB.GreenDim blue As Integer = textColor.RGB.BlueConsole.WriteLine("HexValue: " & textColor.RGB.HexValue)Console.WriteLine("文字颜色:R={0}, G={1}, B={2}", red, green, blue)End IfIf layer.IsBackgroundLayer = True ThenConsole.WriteLine("背景:PixelsLocked={0}, IsBackgroundLayer={1}, Visible={2}", layer.PixelsLocked, layer.IsBackgroundLayer, layer.Visible)' 检查图层是否有蒙版'If layer.HasLayerMask Then' 获取蒙版'Dim layerMask As Object = layer.LayerMask'Console.WriteLine("layerMask:" & layerMask.ToString)'End IfEnd IfNextConsole.WriteLine("========================================")For Each layer As ArtLayer In doc.ArtLayersConsole.WriteLine("图层名称: " & layer.Name)Console.WriteLine("图层LayerType: " & layer.Kind.ToString)Console.WriteLine("图层Opacity: " & layer.Opacity)Console.WriteLine("图层IsBackgroundLayer: " & layer.IsBackgroundLayer)If layer.Kind = PsLayerKind.psTextLayer ThenConsole.WriteLine("图层文字内容: " & layer.TextItem.Contents)Console.WriteLine("图层文字字体: " & layer.TextItem.Font)Console.WriteLine("图层文字字体size: " & layer.TextItem.Size)' 获取文字颜色Dim textColor As SolidColor = layer.TextItem.Color' 获取颜色的分量值Dim red As Integer = textColor.RGB.RedDim green As Integer = textColor.RGB.GreenDim blue As Integer = textColor.RGB.BlueConsole.WriteLine("HexValue: " & textColor.RGB.HexValue)Console.WriteLine("文字颜色:R={0}, G={1}, B={2}", red, green, blue)Console.WriteLine("图层文字BlendMode: " & layer.BlendMode.ToString)Console.WriteLine("变形: {0}" & layer.TextItem.WarpBend)Console.WriteLine("变形弯曲方向: {0}" & layer.TextItem.WarpDirection.ToString)'psNoWarp = 1'psArc = 2'psArcLower = 3'psArcUpper = 4'psArch = 5'psBulge = 6'psShellLower = 7'psShellUpper = 8'psFlag = 9'psWave = 10'psFish = 11'psRise = 12'psFishEye = 13'psInflate = 14'psSqueeze = 15'psTwist = 16Console.WriteLine("变形样式: {0}" & layer.TextItem.WarpStyle.ToString)'抗锯齿效果: 'psNoAntialias = 1 无'psSharp = 2 锐化'psCrisp = 3 清晰'psStrong = 4 浑厚'psSmooth = 5 平滑Console.WriteLine("文本的抗锯齿方法:" & layer.TextItem.AntiAliasMethod.ToString)End IfConsole.WriteLine("BlendMode:" & layer.BlendMode.ToString)If layer.IsBackgroundLayer = True ThenConsole.WriteLine("背景:PixelsLocked={0}, IsBackgroundLayer={1}, Visible={2}", layer.PositionLocked, layer.IsBackgroundLayer, layer.Visible)End IfConsole.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")NextFor Each channel As Channel In doc.ChannelsConsole.WriteLine(" channel.Name=" & channel.Name)Console.WriteLine(" channel.Kind=" & channel.Kind.ToString)NextFor Each historyState As HistoryState In doc.HistoryStatesConsole.WriteLine(" historyState.Name=" & historyState.Name)Console.WriteLine(" historyState.Snapshot=" & historyState.Snapshot)Next' 获取背景图层Dim backgroundLayer As ArtLayer = doc.BackgroundLayerCatch ex As ExceptionConsole.WriteLine("发生异常: " & ex.Message)End Try' 关闭文档doc.Close()' 退出Photoshop应用程序app.Quit()End SubEnd Class

3.解析结果

此方法可以解析到文档基本信息,文档的宽高、颜色模式、分辨率等,图层的基本信息,文字图层信息,文字变化等,图层混合选项及滤镜信息暂时没获取到。

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/297836.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法练习】28:选择排序学习笔记

一、选择排序的算法思想 弄懂选择排序算法,先得知道两个概念:未排序序列,已排序序列。 原理:以升序为例,选择排序算法的思想是,先将整个序列当做未排序的序列,以序列的第一个元素开始。然后从左…

libusb Qt使用记录

1.libusb 下载 ,选择编译好的二进制文件,libusb-1.0.26-binaries.7z libusb Activity 2. 解压 3. 在 Qt Widgets Application 或者 Qt Console Application 工程中导入库,Qt 使用的是 minggw 64编译器,所以选择libusb-MinGW-x64。…

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes(k8s):精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…

保研线性代数复习3

一.基底(Basis) 1.什么是生成集(Generating Set)?什么是张成空间(Span)? 存在向量空间V(V,,*),和向量集(xi是所说的列向量&#xff…

集合/容器

集合概念 当我们保存一组一样(类型相同)的元素时候,我们应该使用一个容器来存储,就可以采用数组,但是数组存在以下缺点: 1、长度开始时必须指定,一旦指定就不能更改。 2、使用数组进行增加元素的步骤比较麻烦 这时候…

深入PostgreSQL中的pg_global表空间

pg_global表空间的位置 在PG当中,一个实例(cluster)初始化完以后,你会看到有下边两个与表空间相关的目录生成: $PGDATA/base $PGDATA/global 我们再用元命令\db以及相关视图看看相应的表空间信息: postgres# \db …

Golang | Leetcode Golang题解之第10题正则表达式匹配

题目&#xff1a; 题解&#xff1a; func isMatch(s string, p string) bool {m, n : len(s), len(p)matches : func(i, j int) bool {if i 0 {return false}if p[j-1] . {return true}return s[i-1] p[j-1]}f : make([][]bool, m 1)for i : 0; i < len(f); i {f[i] m…

重构智能防丢产品,苹果Find My技术引领市场发展

目前市场上最主要的防丢技术是蓝牙防丢和GPS防丢&#xff0c;蓝牙防丢是通过感应防丢器与绑定手机的距离来实现防丢的。一般防丢会默认设置一个最远安全距离&#xff0c;超过这个安全距离后&#xff0c;与手机蓝牙信号断开&#xff0c;触发防丢报警&#xff0c;用户根据防丢报警…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

设计模式 --5观察者模式

观察者模式 观察者模式的优缺点 优点 当一个对象改变的时候 需要同时改变其他对象的相关动作的时候 &#xff0c;而且它不知道有多少具体的对象需要改变 应该考虑使用观察者模式 。观察者模式的工作就是解除耦合 让耦合双方都依赖与抽象 而不是具体 是的各自改变都不会影响另…

Leetcode_2两数相加

文章目录 前言一、两数相加1.1 问题描述1.2 解法一&#xff1a;分别将链表转为数字&#xff0c;然后相加1.3 代码实现1.4 解法二&#xff1a;分别将对应位置数字相加1.5 代码实现 二、使用步骤1.引入库2.读入数据 前言 链表是一种物理内存非连续存储&#xff0c;非顺序的线性数…

golang 和java对比的优劣势

Golang&#xff08;或称Go&#xff09;和Java都是非常流行的编程语言&#xff0c;被广泛应用于各种领域的软件开发。尽管它们都是高级编程语言&#xff0c;但它们具有许多不同的特性和适用场景。本文将重点比较Golang和Java&#xff0c;探讨它们的优势和劣势。 性能方面&#…

Django之关系模型的序列化

一、关系模型的序列化-多查1 1.1、模型准备 from django.db import models# Create your models here. class Classes(models.Model):name = models.CharField(max_length=20, verbose_name=班级)class Student(models.Model):SEX_CHOICES = ((1,男)), (2, 女)name = models.C…

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为&#xff1a; 注册&#xff1a;注册成为百度AI开放平台开发者&#xff1b;创建AI应用&#xff1a;在百度API开放平台上创建相关类型的的AI应用&#xff0c;获得AppID、API Key和Secret Key&#xff1b;调用API&#xff1a;调用…

Mac删除软件,动一动手指,几秒就彻底删除 mac删除软件删不掉的解决方法 mac删除软件后怎么删除软件数据

当你入职新公司&#xff0c;接手前任员工使用的Mac电脑时&#xff0c;很可能会遇到一个非常普遍的问题&#xff1a;电脑中装有大量你不需要的软件。这些软件不仅占用宝贵的硬盘空间&#xff0c;还可能影响电脑的运行速度和效率。为了获得一个干净、清爽的使用体验&#xff0c;删…

Spark-Scala语言实战(12)

在之前的文章中&#xff0c;我们学习了如何在spark中使用键值对中的join,rightOuterJoin,leftOuterJoin三种方法。想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢…

小林coding图解计算机网络|基础篇01|TCP/IP网络模型有哪几层?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a; 文章目录 应用层(Application Layer)传输层(Transport Layer)TCP段(TCP Segment) 网络层(Internet Layer)IP协议的寻址能力IP协议的路由能力 数据链路层(Link Lay…

Redis 主从复制,哨兵模式,集群

目录 主从复制 主从复制 作用 缺陷 主从复制流程 实现Redis主从复制 哨兵模式 主从复制切换的缺点 哨兵的核心功能 哨兵模式原理 哨兵模式的作用 哨兵结构组成 故障转移机制 主节点的选举 实现哨兵模式 集群(Cluster) redis群集有三种模式&#xff0c;主从复制…

【Linux】网络基础常识{OSI七层模型/ TCP/IP / 端口号 /各种协议}

文章目录 1.网络常识1.0DHCP协议1. 1IP地址/MAC地址/ARP协议是什么&#xff1f;IP/MACARP&#xff1a;IP ⇒ MAC 1.2手机连接wifi的原理 SSID与BSSID手机连接wifiSSID与BSSID 1.3手机如何通过“数据/流量”上网&#xff1f;1.4电脑连接wifi的原理&#xff1f;电脑通过热点上网…

SystemHelper已停止运行解决方案

当手机一开机就提醒 SystemHelper已停止运行&#xff0c;但手机也能正常使用就是部分软件打不开怎么办&#xff1f; 有此提示说明你的系统已经 Root 了并且你安装了某些不知名的软件或者 Magisk 模块导致系统环境发生了不可逆的修改&#xff0c;有 Magisk 建议还原官方 Boot 启…