2015-07-27 6 views
0

Я предполагал, что обрезка изображения будет очень простой задачей из .net. Но независимо от того, что я пытаюсь, я просто не могу заставить работать.Photoshop урожай с vb.net

документация несколько неопределенна -

«Первый параметр представляет собой массив из четырех координат, которые отмечают часть оставшейся после обрезки»

Это может означать массив из четырех чисел, или это может означать массив из четырех массивов двух чисел (координата после всех состоит из двух чисел). «часть, оставшаяся после обрезки», я подразумеваю «часть изображения, предназначенного для сохранения после обрезки».

Поскольку функция select принимает массив координатных массивов - {{x1, y1}, y2, y2}, {x3, y3}, {x4, y4}} - я надеялся, что урожай будет работать одинаково путь. Нет кубиков.

Далее я пробовал очень простой подход, предположим, что «левый, верхний, правый, нижний» действительно означает именно это. Итак, я подключил совершенно разумные ценности и ... не кубики.

В каждом случае PS выдает диалоговое окно с сообщением «Не удалось выполнить команду, потому что затронутая область пуста или не перекрывает холст».

Вот фрагмент кода:

Dim PSDapp 
    PSDapp = CreateObject("Photoshop.Application") 
    Dim psarray As Object = {20, 20, 120, 120} 
    Dim PSDcurrentDoc 
    PSDapp.preferences.rulerUnits = 1 
    PSDcurrentDoc = PSDapp.open("c:\cat.bmp") 
    PSDapp.activeDocument = PSDapp.documents.item(1) 
    PSDcurrentDoc.crop(psarray) 

Что еще более странно, что, если я беру выше код и портировать его в сценарий, он работает просто отлично. Может кто-нибудь (кто-нибудь!), Пожалуйста, напишите минимальный рабочий пример использования функции обрезки, используя COM (а не скриптинг)?

ответ

0

Я никогда не использовал Photoshop, но массив координат может быть записана следующим образом:

Dim psarray() As Point = { 
    New Point(20, 20), 
    New Point(120, 20), 
    New Point(120, 120), 
    New Point(20, 120) 
} 
PSDcurrentDoc.crop(psarray) 

Так что вы пытались что-то вроде этого уже?

Dim psarray() As Integer = {20, 20, 120, 120} 
PSDcurrentDoc.crop(psarray) 

Если это не сработает, попробуйте "прижав" это:

Dim psarray() As Integer = {20, 20, 120, 120} 
Dim gch As System.Runtime.InteropServices.GCHandle 
gch = System.Runtime.InteropServices.GCHandle.Alloc(psarray, Runtime.InteropServices.GCHandleType.Pinned) 
PSDcurrentDoc.crop(gch.AddrOfPinnedObject) 
gch.Free() 
+0

Thanks Idle_Mind - Я согласен, что это был бы хороший подход в .netLand, но PS pukes, когда я его пробую. То, что вы предлагаете, - это то, что PS хочет для выбора - массив массивов. Как ни странно, это прекрасно работает, чтобы создать окно выбора. Урожай кажется другим. Если я получаю доступ к функции crop через VBS, тогда простой массив целых чисел из четырех значений («left», «top», «right», «bottom») работает так, как ожидалось. Тот же массив, прошедший через мой код vb.net, не работает. Бешенство! Это должно быть 10-секундная сделка ... –

0

решаемые с обходным.

Я использовал выбор как обход. Код длиннее, чем это действительно должно быть, так как я должен сначала сделать выбор, но он делает работы.

Ниже приведена полная рабочая подпрограмма, подключенная к кнопке. Я надеюсь, что это будет полезно для кого-то, кто может столкнуться с этой проблемой.

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button1.Click 

     Dim x As Integer = 100 ' The x-coordinate of the upper-left corner (pixel units). 
     Dim y As Integer = 100 ' The y-coordinate of the upper-left corner (pixel units). 
     Dim w As Integer = 200 ' The width of the selection/crop (pixel units). 
     Dim h As Integer = 200 ' The height of the selection/crop (pixel units). 

     Dim psArray1() As Object = {x, y} 
     Dim psArray2() As Object = {x, y + h} 
     Dim psArray3() As Object = {x + w, y + h} 
     Dim psArray4() As Object = {x + w, y} 
     Dim psArray() As Object = {psArray1, psArray2, psArray3, psArray4} ' A concatenated object consisting of an array of coordinates. 

     Dim PSDapp As Object = CreateObject("Photoshop.Application") 
     Dim PSDcurrentDoc As Object = PSDapp.open("c:\cat.bmp") ' Could be any document of course. 

     PSDapp.preferences.rulerUnits = 1 
     PSDcurrentDoc.selection.select(psArray) 
     Dim selectArray As Object = PSDcurrentDoc.selection.bounds 
     PSDcurrentDoc = PSDcurrentDoc.crop(selectArray) ' This is key. PSDcurrentDoc.crop is read-only, so it must be assigned. 

    End Sub 
Смежные вопросы