VB 通过COM接口解析PSD文件

2024-04-04 21:44
文章标签 接口 解析 com vb psd

本文主要是介绍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.解析结果

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

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

这篇关于VB 通过COM接口解析PSD文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/876883

相关文章

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

Java图片压缩三种高效压缩方案详细解析

《Java图片压缩三种高效压缩方案详细解析》图片压缩通常涉及减少图片的尺寸缩放、调整图片的质量(针对JPEG、PNG等)、使用特定的算法来减少图片的数据量等,:本文主要介绍Java图片压缩三种高效... 目录一、基于OpenCV的智能尺寸压缩技术亮点:适用场景:二、JPEG质量参数压缩关键技术:压缩效果对比

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

CSS Padding 和 Margin 区别全解析

《CSSPadding和Margin区别全解析》CSS中的padding和margin是两个非常基础且重要的属性,它们用于控制元素周围的空白区域,本文将详细介绍padding和... 目录css Padding 和 Margin 全解析1. Padding: 内边距2. Margin: 外边距3. Padd

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接