VB 通过COM接口解析PSD文件

news2024/11/20 11:41:21

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

0.添加Photoshop 引用

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

1.在vb文件添加导入Photoshop

在这里插入图片描述

2.解析psd

话不多说,直接上代码:


Imports Photoshop
Imports System.IO

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim filePath As String = "D:\PhotoshopCS6操作题1\1\PS1.psd"
        parsePsd(filePath)
    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Console.WriteLine("ssss")
        Dim filePath As String = "D:\PhotoshopCS6操作题1\1\PS1.psd"
        parsePsd(filePath)
    End Sub

    Private Sub parsePsd(filePath As String)
        Dim fileInfo As New FileInfo(filePath)
        Dim fileSizeInBytes As Long = fileInfo.Length
        Dim fileSizeInMB As Double = fileSizeInBytes / (1024 * 1024)

        If fileSizeInMB > 5 Then
            Console.WriteLine("文档大小[{0}MB]超过5MB", fileSizeInMB)
        Else
            Console.WriteLine("文档大小[{0}MB]符合要求", fileSizeInMB, fileSizeInBytes)
        End If
        ' 创建Photoshop应用程序对象
        Dim app As New Photoshop.Application()

        ' 打开PSD文件
        Dim doc As Photoshop.Document = app.Open(filePath)
        Try
            Console.WriteLine("名称: " & doc.Name)
            Console.WriteLine("文档尺寸宽: " & doc.Width)
            Console.WriteLine("文档尺寸高: " & doc.Height)
            Console.WriteLine("颜色模式: " & doc.Mode.ToString)

            ' 获取图像分辨率
            Dim resolution As Double = doc.Resolution
            Console.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.Layers
                Console.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 Then
                    Console.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.Red
                    Dim green As Integer = textColor.RGB.Green
                    Dim blue As Integer = textColor.RGB.Blue
                    Console.WriteLine("HexValue: " & textColor.RGB.HexValue)
                    Console.WriteLine("文字颜色:R={0}, G={1}, B={2}", red, green, blue)
                End If
                If layer.IsBackgroundLayer = True Then
                    Console.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 If
                End If
            Next

            Console.WriteLine("========================================")

            For Each layer As ArtLayer In doc.ArtLayers
                Console.WriteLine("图层名称: " & layer.Name)
                Console.WriteLine("图层LayerType: " & layer.Kind.ToString)
                Console.WriteLine("图层Opacity: " & layer.Opacity)
                Console.WriteLine("图层IsBackgroundLayer: " & layer.IsBackgroundLayer)

                If layer.Kind = PsLayerKind.psTextLayer Then


                    Console.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.Red
                    Dim green As Integer = textColor.RGB.Green
                    Dim blue As Integer = textColor.RGB.Blue
                    Console.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 = 16
                    Console.WriteLine("变形样式: {0}" & layer.TextItem.WarpStyle.ToString)
                    '抗锯齿效果: 
                    'psNoAntialias = 1 无
                    'psSharp = 2 锐化
                    'psCrisp = 3 清晰
                    'psStrong = 4 浑厚
                    'psSmooth = 5 平滑
                    Console.WriteLine("文本的抗锯齿方法:" & layer.TextItem.AntiAliasMethod.ToString)


                End If
                Console.WriteLine("BlendMode:" & layer.BlendMode.ToString)

                If layer.IsBackgroundLayer = True Then
                    Console.WriteLine("背景:PixelsLocked={0}, IsBackgroundLayer={1}, Visible={2}", layer.PositionLocked, layer.IsBackgroundLayer, layer.Visible)

                End If
                    Console.WriteLine(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
            Next

            For Each channel As Channel In doc.Channels
                Console.WriteLine(" channel.Name=" & channel.Name)
                Console.WriteLine(" channel.Kind=" & channel.Kind.ToString)
            Next
            For Each historyState As HistoryState In doc.HistoryStates
                Console.WriteLine(" historyState.Name=" & historyState.Name)
                Console.WriteLine(" historyState.Snapshot=" & historyState.Snapshot)
            Next

            ' 获取背景图层
            Dim backgroundLayer As ArtLayer = doc.BackgroundLayer

          
        Catch ex As Exception
            Console.WriteLine("发生异常: " & ex.Message)
        End Try
        ' 关闭文档
        doc.Close()
        ' 退出Photoshop应用程序
        app.Quit()
    End Sub

End Class

3.解析结果

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

易语言创建数据库

易语言是一门中文编程语言,由国人开发,虽然比较冷门,但是在有些场合却非常流行,比如自动化脚本,还有开发外挂。 以下将用一个简单的用户表,演示易语言创建数据库的几种方式: 1. 使用菜单创建数…

无人售货奶柜:开启便捷生活的新篇章

无人售货奶柜:开启便捷生活的新篇章 在这个快节奏的现代生活中,科技的革新不仅为我们带来了前所未有的便利,更在不经意间改变着我们的日常。其中,无人售货技术的出现,尤其是无人售货奶柜,已经成为我们生活…

pta 1086 就不告诉你

1086 就不告诉你 分数 15 全屏浏览 切换布局 作者 CHEN, Yue 单位 浙江大学 做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数…

图像拼接——最小割准则提取拼接缝

一、最大流问题与Ford-Fulkerson算法介绍 二、最大流与最小割 显然,我们有对任意一个割,穿过该割的净流量上界就是该割的容量,即不可能超过割的容量。所以网络的最大流必然无法超过网络的最小割。最小割是指割的容量最小,最大流是指网络当中最大的净流量,简单的例子s是水龙…

Vue3从入门到实战:路由知识点

本人在B站上关于vue3的尚硅谷的课程,以下是整理一些笔记。 1.两个知识点 1.路由组件通常存放在pages 或 views文件夹,一般组件通常存放在components文件夹。 组件可以分为: 1. 一般组件:亲手写标签出来的 2. 路由组件&#…

武汉星起航电子商务公司领航跨境电商新纪元,助力品牌走向全球

在全球经济一体化的时代背景下,跨境电商正成为推动国际贸易增长的重要力量。武汉星起航电子商务有限公司,作为一家专注于提供一站式解决方案的跨境电商服务商,凭借其丰富的实战经验和专业团队,在行业中取得了令人瞩目的成绩。 自…

获取天翼网关TEWA-708E超级管理员密码

Download RouterPassView 参考:破解光猫超级管理员密码(网关型号:TEWA-708E) - 知乎

Linux集群(一)Nginx搭建

目录 一、Nginx介绍 1.什么是Nginx 2.Nginx的特点 二、Nginx配置 1.jdk的安装 1.1检查jdk版本 1.2上传并安装jdk 2.安装Tomcat 3.下载Nginx 3.1安装依赖包 ​编辑 3.2安装Nginx 3.3运行 三、Nginx中的常用命令​编辑 一、Nginx介绍 1.什么是Nginx Nginx(…

C++初阶:stack和queue使用及模拟实现

stack的介绍和使用 stack的介绍 堆栈 - C 参考 (cplusplus.com) 翻译 : 1. stack 是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。 2. stack 是作为容器适配器被实现的,容器…

【Java笔记】多线程0:JVM线程是用户态还是内核态?Java 线程与OS线程的联系

文章目录 JVM线程是用户态线程还是内核态线程什么是用户态线程与内核态线程绿色线程绿色线程的缺点 线程映射稍微回顾下线程映射模型JVM线程映射 线程状态操作系统的线程状态JVM的线程状态JVM线程与OS线程的状态关系 Reference 今天复盘一下Java中,JVM线程与实际操作…

大模型学习笔记一

前言 随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、AI是什么? 二、大模型能干什么 大模型,全称「大语言模型」,英文「Large…

栈的应用——用栈实现算数混合运算表达式的计算

1、单目运算符双目运算符 算数运算符分为单目运算符和双目运算符等 单目运算符只需要一个操作数,双目运算符需要两个操作数 双目运算符最常见:常见的算术运算符:*/,比较运算符:<>=等等以下是一些单目运算符:正号 (+): 用于表示正数或给数值一个正号。例如:+5 仍然…

MySql 实战大数据查询-(表分区实现)

一 mysql分区&#xff1a; 分区是将单个表按照某种规则划分成多个子集&#xff0c;每个子集称为一个分区。常见的分区策略包括按照时间范围、范围值、列表等进行分区。 优点&#xff1a; 查询性能更好&#xff0c;涉及分区键的查询&#xff0c;数据库引擎可以只扫描特定分区&…

最优算法100例之30-表示数值的字符串

专栏主页&#xff1a;计算机专业基础知识总结&#xff08;适用于期末复习考研刷题求职面试&#xff09;系列文章https://blog.csdn.net/seeker1994/category_12585732.html 题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&a…

卷积篇 | YOLOv8改进之引入全维度动态卷积ODConv | 即插即用

前言:Hello大家好,我是小哥谈。ODConv是一种关注了空域、输入通道、输出通道等维度上的动态性的卷积方法,一定程度上讲,ODConv可以视作CondConv的延续,将CondConv中一个维度上的动态特性进行了扩展,同时了考虑了空域、输入通道、输出通道等维度上的动态性,故称之为全维度…

LeetCode第六题:Z 字形变换 【6/1000 python】

&#x1f464;作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 LeetCode解锁1000题: 打怪升级之旅htt…

springboot实战---7.springboot制作Docker镜像

&#x1f388;个人主页&#xff1a;靓仔很忙i &#x1f4bb;B 站主页&#xff1a;&#x1f449;B站&#x1f448; &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;SpringBoot &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&…

七、Promethus监控系统

一、普罗米修斯监控系统 1、为什么需要监控&#xff1a; ① 实时收集数据&#xff1a;监控工具能够实时收集关于系统、应用、网络等各方面的数据&#xff0c;包括性能指标、错误日志、用户行为等。 ② 及时发现问题&#xff1a;通过实时数据收集和分析&#xff0c;监控系统能…

带头双向循环链表,顺序表和链表的比较

双向链表 单链表结点中只有一个指向其后继的指针&#xff0c;使得单链表只能从前往后依次遍历&#xff0c;要访问某个结点的前驱&#xff08;插入、删除操作时&#xff09;&#xff0c;只能从头开始遍历&#xff0c;访问前驱的时间复杂度为O(N)。为了克服这个缺点&#xff0c;…

SSM实战项目——哈哈音乐(二)后台模块开发

1、项目准备 ① 引入后台模块&#xff08;hami-console&#xff09;需要的依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…