[Photoshop] 이미지를 쪼개서 png로 저장하는 스크립트

현재 제작중인 '마왕의 책'에서 배경을 커다락 블럭으로 만들어서 조합해서 사용하고 있습니다.

그러다보니 배경을 패턴에 맞춰서 그린 후 그것을 일정 간격으로 잘라서 저장해야 합니다.

그런데 매번 PSD 파일에서 일정 간격을 Crop해서 저장하는 과정이 너무나도 번거롭기 때문에 자동화 해보기로 했습니다.

Photoshop에는 photoshop script를 이용한 자동화가 가능합니다.
이 스크립트로는 아주 많은 기능을 구현할 수 있습니다.

기본적으로 이번에 작성한 스크립트는 아래와 같이 단순합니다.

function main() {
    if( app.documents.length == 0 ) {
        alert("This script requires that there are open document to run.");
    } else {
        var outputFolder = Folder.selectDialog ("Select a folder for the output files");
        if( outputFolder == null ) {
            alert("You have to select output folder.");
            return;
        }
        var cropWidth = parseInt(prompt("Input crop width", "100", "Input width"));
        
        var docOriginName = app.activeDocument.name + "";
        var docWidth = app.activeDocument.width.value;
        for(var offset = 0 ; offset < docWidth ;  offset += cropWidth ) {
            var docOrigin = app.documents.getByName (docOriginName);
            app.activeDocument = docOrigin;
            $.writeln (docOrigin.name);
            //$.sleep(1000);
            var doc = docOrigin.duplicate();
            var width = cropWidth;
            if( docWidth - offset < cropWidth )
                width = docWidth - offset;
            var bound = [offset, 0, offset + width, docOrigin.height.value];
            doc.crop(bound);
            var pngOptions = new PNGSaveOptions();
            pngOptions.compression = 0
            pngOptions.interlaced = false
            doc.saveAs( File( outputFolder + "/" + docOrigin.name + "_split" + offset / cropWidth + ".png"), pngOptions, false);
            doc.close();
        }
    }
}

main();

내부 코드를 단계별로 나눠서 설명하겠습니다.
스크립트 레퍼런스는 아래 링크에 있습니다.
http://wwwimages.adobe.com/content/dam/Adobe/en/products/photoshop/pdfs/cs6/Photoshop-CS6-JavaScript-Ref.pdf

 

app.documents
이 부분은 현재 Photoshop에 열려있는 이미지들을 말합니다.
app.documents.length == 0 으로 체크하는 것은 열려 있는 파일이 하나도 없는 경우를 말합니다.
쪼개려는 이미지가 있어야 스크립트가 실행가능하기 때문에 현재 열려있는 이미지가 있는지 확인해 줍니다.

alert("Hello world!!");
이 함수는 Photoshop에서 메시지 박스를 출력합니다.

 

Folder.selectDialog("message");
이 함수는 폴더선택창을 열어줍니다.
쪼갠 이미지를 저장하기 위한 폴더를 선택합니다.

prompt("message", "default value", "title");
이 함수는 값을 입력받기 위한 입력박스를 열어줍니다.
입력받는 문자열값을 숫자로 처리하기 위해서 parseInt 함수를 사용합니다.

app.activeDocument
이 속성은 현재 활성화된 이미지를 말합니다.
쪼개려는 이미지 윈도우를 활성화 시킨 상태에서 실행하면 됩니다.
app.activeDocument.name은 이미지의 이름을 말합니다.
아래 이미지에서 화살표로 표시된 부분에 '농장컨셉이미지.jpg' 가 이름입니다.

document는 직역하면 문서지만 Photoshop에서는 이미지를 말합니다.
document.width, document.height는 이미지의 크기이며 타입은 UnitValue입니다.

UnitValue는 여러가지 단위를 표현하기 위한 객체입니다.
var length = new UnitValue(100, "px"); //100 pixels
new UnitValue(100, "in"); // 100 inches

위와 같이 다양한 길이 단위를 표현할 수 있습니다.
기본적으로는 pixel단위를 사용하는 듯 합니다.

document.duplicate(["name"], [true/false]);
이 함수는 document 이미지를 복제해서 새로운 이미지를 만듧니다.
이때 별도로 두번째 파라메터를 정하지 않으면 모든 layer가 합쳐진 이미지가 생성됩니다.

document.crop( bounds, [rotation], [width], [height]);
이 함수는 말 그대로 이미지를 crop해줍니다.
var bounds = [left x, left y, right x, right y];
document.crop(bounds);
이렇게 호출해 주면 해당 영역만 남기고 이미지를 잘라냅니다.

PNGSaveOptions는 PNG로 저장하기 위한 저장옵션을 설정합니다.

doc.saveAs는 말 그대로 이미지를 저장하기위한 함수이고
doc.close()는 열린 이미지를 닫습니다.

이런 단순한 코드로 귀찮은 작업을 줄일 수 있습니다.