我在COM兼容性问题上有问题。这个链接已经非常有用了,COM interface Photoshop compatibility issue解释说,COM兼容性问题可以用后期绑定来解决。我已经尝试过了,但是现在我对如何使用以前通过COM对象访问的类型感到困惑。
原始代码:
//This works with late binding
m_Application = new Photoshop.Application();
var refe = new Photoshop.ActionReference();
refe.PutProperty(m_Application.CharIDToTypeID("Prpr"), m_Application.CharIDToTypeID("NmbL"));
//This is the problem area
var ColorlendMode = Photoshop.PsBlendMode.psColorBlend;
var visibleLayers = new List<Photoshop.ArtLayer>();后期绑定代码:
//works...
dynamic m_Application = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"));
dynamic refe = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.ActionReference"));
refe.PutProperty(m_Application.CharIDToTypeID("Prpr"), m_Application.CharIDToTypeID("NmbL"));
//PROBLEM:
//Doesn't compile
Type BlendModeType = Type.GetTypeFromProgID("Photoshop.PsBlendMode").psColorBlend;
//returns null
//Type BlendModeType = Type.GetTypeFromProgID("Photoshop.PsBlendMode");
//Type artLayerType = Type.GetTypeFromProgID("Photoshop.ArtLayer");编译erorr是:
'System.Type' does not contain a definition for 'psColorBlend'那么,如何获得我以前使用Photoshop COM对象获得的枚举PsBlendMode (在我的项目中作为引用添加)?
发布于 2014-01-15 06:31:32
好吧,不同的想法:
只需定义您自己的枚举来表示PSColorBlen并使用它
public enum PsBlendMode
{
psColorBlend = 22
}
var ColorlendMode = PsBlendMode.psColorBlend;当您将int传递到调用中时,您可能不得不将其转换为int。
有关常量值的列表,请参见此处:http://fs.mis.kuas.edu.tw/~wchsieh/photoshopy9.py
发布于 2014-02-27 07:54:38
试试这个代码..。您将获得混合模式名为字符串类型。
Public Enum EBlendModes
None = 0
psSoftLight = 13
psScreen = 9
psNormalBlend = 2
psMultiply = 5
psColorBurn = 6
psDissolve = 3
psHardMix = 26
psHardLight = 14
psDarken = 4
psDifference = 18
psColorBlend = 22
psPinLight = 17
psOverlay = 12
psVividLight = 15
psLighterColor = 27
psLinearLight = 16
psDarkerColor = 28
psLinearDodge = 11
psLinearBurn = 7
psExclusion = 19
psLuminosity = 23
psSubtract = 29
psPassThrough = 1
psColorDodge = 10
psDivide = 30
psSaturationBlend = 21
psLighten = 8
psHue = 20
End Enum
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Try
Dim _appref = Activator.CreateInstance(Type.GetTypeFromProgID("Photoshop.Application"))
Dim _blndmod As EBlendModes = CInt(_appref.activedocument.Activelayer.blendmode)
MsgBox(_blndmod.ToString)
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub结果是:PsNormalBlend.你是否期望这样.
发布于 2014-01-14 01:53:06
我不认为你能做你想做的事。您能做的最接近的事情是使用反射循环遍历枚举,以找到您想要的字符串。
参见:http://www.codeproject.com/Tips/550160/Getting-enum-value-from-another-class-via-Reflecti
试着运行它,看看它是否打印出了psColorBlend的值
var fieldsArray = Type.GetTypeFromProgID("Photoshop.PsBlendMode").GetFields(BindingFlags.Public | BindingFlags.Static);
foreach (var fInfo in fieldsArray)
{
var ulngValue = (ulong)Convert.ChangeType(fInfo.GetValue(null), typeof(ulong));
Console.WriteLine(fInfo.Name.ToString(CultureInfo.InvariantCulture) + " : " + ulngValue.ToString(CultureInfo.InvariantCulture));
} https://stackoverflow.com/questions/21103540
复制相似问题