Все хорошие ответы, спасибо за вклад.
Как я уже сказал, мне интересно, есть ли что-нибудь для Photoshop.
Для целей документации вот небольшой сценарий, который я написал:
var doc = app.activeDocument;
var arranger = makeDialog();
arranger .arrange.onClick = function(){
if(isNaN(parseInt(arranger.w.text)) || isNaN(parseInt(arranger.h.text)) || isNaN(parseInt(arranger.c.text)) || isNaN(parseInt(arranger.r.text))){
alert('Yo! Can you feed \' dis dialog some integer numbers ?\n For Real!');
}else{
sliceLayer(parseInt(arranger.w.text),parseInt(arranger.h.text),parseInt(arranger.r.text),parseInt(arranger.c.text));
}
arranger.close();
}
arranger.show();
function sliceLayer(w,h,r,c){
var hw = w * 0.5;
var hh = h * 0.5;
var l0 = doc.activeLayer;
for(var j = 0 ; j < r ; j++){
for(var i = 0 ; i < c; i++){
var x = i * w; //edited
var y = j * h; //here
//select
doc.selection.select([[x,y],[x+w,y],[x+w,y+h],[x,y+h]]);
//new layer via cut
doc.selection.cut();
var layer = doc.artLayers.add();
doc.paste();
//move
//$.writeln('translate x: '+(y)+', y: '+(x));
// move layer with relative coordinates
// layer.translate(y,x);
// move layer with absolute coordinates
MoveLayerTo( layer, x, y );
doc.activeLayer = l0;
}
}
l0.remove();//remove original layer(now empty)
}
function makeDialog(){
var dialog = new Window('dialog','Slice and Dice');
dialog.frameLocation = [300,300];
dialog.w = dialog.add('edittext',undefined,'Selection width');
dialog.w.prefferedSize = [200,50];
dialog.h = dialog.add('edittext',undefined,'Selection height');
dialog.h.prefferedSize = [200,50];
dialog.c = dialog.add('edittext',undefined,'Grid Columns(V sections)');
dialog.c.prefferedSize = [200,50];
dialog.r = dialog.add('edittext',undefined,'Grid Rows(H sections)');
dialog.r.prefferedSize = [200,50];
dialog.arrange = dialog.add('button',undefined,'Chop Chop');
return dialog;
}
//******************************************
// MOVE LAYER TO
// Author: Max Kielland
//
// Moves layer fLayer to the absolute
// position fX,fY. The unit of fX and fY are
// the same as the ruler setting.
function MoveLayerTo(fLayer,fX,fY) {
var Position = fLayer.bounds;
Position[0] = fX - Position[0];
Position[1] = fY - Position[1];
fLayer.translate(-Position[0],-Position[1]);
}
Если вы сохраните это в Photoshop/Presets/Scripts как файл .jsx, вы сможете получить к нему доступ через Scripts в меню File. Вы также можете использовать Файл -> Сценарии -> Обзор ... со сценарием в любом месте на вашем компьютере.
Он попросит четыре вещи:
- Ширина выделения - насколько широко вы хотите, чтобы каждый блок в сетке был
- Высота выделения - какой высоты вы хотите, чтобы каждый блок в сетке был
- Столбцы сетки (V разделы) - сколько столбцов должно быть после разделения
- Строки сетки (секции H) - сколько строк должно быть после того, как они разделены
Если вы получаете сообщение об ошибке, что документ не найден, вам просто нужно сначала открыть изображение перед его запуском.
Проблема с этим подходом JSX заключается в том, что для больших подразделений он немного медленный (100x100).
Я предполагаю, что с связью MATLAB/Photoshop будет быстрее, но сейчас я пропущу это.
Достижение той же цели в ActionScript 3 с использованием copyPixels(), и это довольно быстро.