반응형

필자의 블로그 명칭을 보고 이미 알고 계신분이 있을지 모르겠지만 사실 저는 디자이너 입니다. 하지만 블로그에 맨 개발 관련 된 이야기만 적고 있지요.

음... 그런데 실제로 회사에서도 저는 대부분의 시간을 코드와 씨름하며 지내고 있습니다.

회사에서 사람들은 개자이너라고 부르기도 합니다.  디자인 팀에 있지만 디자인은 잘 못합니다. -_-;;

 

어쨌든 오늘은 본격적으로 C# 으로 프로그램을 하나 만들 예정입니다. (프로그램은 맨 아래 있습니다)

이름하야 "ExcelAutomate" 두둥~

네.. 그렇습니다. 제가 VBA 로 각종 자동화 로직을 올렸는데요. 사실 개발에 관심은 1도 없는 분들이 과연 VBA 창을 열어놓고 제가 올려드린 코드를 붙여넣고 경로와 설정을 세팅해가며 자동화 로직을 사용할 것이냐! 하는것이죠.

아마 아니겠죠.

 

그래서 부족한 실력이나마 저도 개발 공부를 할 겸 프로그램을 만들어 보기로 하였습니다.

개발은 1도 몰라도 사용할 수 있는 엑셀 자동화 프로그램 말이죠.

제가 애정하는 프로그램중에 DarkNamer 라고 있습니다. 그런 누구에게나 사랑받는 툴을 한번만들어 보겠습니다. 바로 이 글을 읽는 여러분과 함께요.

네 이 포스트는 바로 방문객 참여형 포스트가 되겠습니다. 

이 포스트에 뎃글로 남겨주시는 엑셀 자동화 기능을 제가 한번 만들어 보겠습니다. 어디까지 할수 있을지는 모르겠지만 한번 최선을 다해 보겠습니다.

물론 참여 해주시지 않아도 저는 만들겠지만요. 그렇게 되면 어쩌면 제가 사용하는 기능들만 담을 지 모르겠습니다.

자 그럼 시작하겠습니다. 여기부터는 계속 업데이트 될 때 마다 내용을 추가하도록 하겠습니다. 가장 아래쪽에 항상 최신 버전의 Application 을 올리도록 하겠습니다.

바이러스 따위는 없으니 걱정마세요.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

첫번째는 그림 자동으로 붙여 넣기 입니다.

네 첫번째 버전입니다.

프로그램을 실항하기 전 엑셀 시트를 열어 놓고 이미지 이름이 붙어있는 데이터를 준비합니다. 

이미지 파일명이 기록된 엑셀 시트를 준비하자

요렇게요.

그런 다음 다운로드 받은 툴을 실행합니다.

그런 다음 엑셀 오토메이트에서 [get xls name] 버튼을 클릭합니다. 

 

그러면 오른쪽 드롭다운 메뉴에 현재 열려있는 엑셀 파일명이 보여집니다. 해당 엑셀 파일을 선택한 뒤

이미지를 붙여넣을 시트를 선택해 주어야 합니다. [get sheet name] 버튼을 클릭합니다.

그러면 역시 우측 드롭다운 메뉴에 시트 명칭이 표시가 됩니다.

해당 시트까지 선택해 준 뒤 아래 image name start 라는 칸에 이미지 이름이 있는 첫번째 칸의 이름을 적어 줍니다. A2 이런 식으로 적으면 됩니다.

그리고 이미지가 붙을 첫번째 칸의 이름을 역시 paste start에 붙여 줍니다. 

만약 이미지 이름안에 확장자가 없는 경우 우측 extension 칸에 확장자 명을 적어 줍니다. 이때 반드시 . 을 포함하여 ".png" 와 같이 적어 주어야 합니다.

제 예제와 같이 파일명 안에 확장자가 포함된 경우 무시해도 됩니다.

그리고 마지막으로 맨 아래 칸에 이미지가 들어있는 경로 이름을 적어주면 됩니다.

그럼 이런 상태가 되죠

요 상태에서 Run 버튼을 누르시면 바로 엑셀 시트에 이미지가 붙게 됩니다.

이미지가 자동으로 추가된 모습

 

엑셀에 있는 여러개의 그림을 지울때는 두번째 Tab 에 있는 "delete image" 를 선택합니다.

기본으로 설정되어 있는 영역을 변경해 줍니다. 예를 들면 B2 ~ B100 까지의 셀에 들어있는 이미지를 지우려면 

"delete range from" 의 값을 B2로, "delete range To" 의 값을 B100 으로 작성한 뒤 Run 버튼을 눌러주게 되면 해당 영역의 이미지가 자동으로 모두 지워지게 됩니다.

B2 ~ F1000 과 같이 하면 한줄이 아닌 여러 열의 이미지를 한번에 지울 수 있습니다.

 

2022-05-28 업데이트

> 가로로 붙이기 기능이 추가되었습니다. 체크박스(가로로 붙이기) 선택

이미지 가로로 붙이기

> 하위폴더에 이미지가 있는 경우도 동작하게 하였습니다. 

하위폴더에 이미지가 들어있는 경우도 동작

> 셀 고정 크기 지원 : 이미지를 붙이는 동안 셀의 크기를 조정하지 않습니다.

> get sheet 버튼 삭제 : 엑셀 이르을 선택하면 자동으로 sheet 가 리스트에 포함됩니다.


2023-01-11 업데이트

> 붙여넣을 이름이 유사한 경우 잘못 붙는 오류 수정 (이름이 정확히 동일할 때만 동작)



<프로그램 구매하기>

프로그램을 이용하는데 별도로 비용을 지불하실 필요는 없지만 유용하게 사용하고 계신다면 아래 링크를 통하여 후원을 해주시면 됩니다. 커피한잔 사준다 생각하시고 후원 해 주시면 또 다른 좋은 프로그램을 만드는데 도움이 될 것 같습니다. 

 

<주의사항>

엑셀 2016 에서 테스트 되었습니다,

시트의 확대 축소 비율을 100% 인 상태에서 실행해 주세요.

 

 

<다운로드 링크>

excelAutomate.7z
0.02MB
excelAutomate.zip
0.04MB

 

 

<다운로드 링크 - 구글드라이브>

https://drive.google.com/file/d/1jCSz9rNPuA4Q482ocyE6yAUjUIyhE0_h/view?usp=sharing 

 

excelAutomate.7z

 

drive.google.com

https://drive.google.com/file/d/12vDwn6WM_lAuqrwfZ1ShMXjKvajYZoNE/view?usp=sharing 

 

excelAutomate.zip

 

drive.google.com

프로그램 - 7zip 또는 zip 버전 중 하나를 다운받으신 뒤 압축을 풀고 사용하시면 됩니다.

뎃글로 필요하신 기능 남겨 주시면 한번 있는 힘껏 개발해 보겠습니다.

 

감사합니다.

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면 클릭!!  부탁드려요~

 

 

 

 

2020/03/18 - [DEV/VBA] - 엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

 

엑셀 머릿글(header)에 이미지 또는 문구 자동으로 삽입하기

오늘 포스트에서는 지난 엑셀 자동화 툴의 뎃글로 문의 주신 헤더에 이미지를 VBA 를 이용하여 자동으로 삽입하는 내용을 소개해 드릴까 합니다. "엑셀파일 수백개가있는데 파일의 시트마다 머리글에 이미지를 삽..

diy-dev-design.tistory.com

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

 

[C#] C# APP 에서 엑셀 연동해보기

엑셀에서 VBA 로 코드를 짜다 보면 막상 특정 엑셀 파일에만 VBA 가 적용이 가능하기 때문에 막상 다른 엑셀 파일에서 동일한 동작을 하려면 또 코드를 복사해 넣고 실행을 해야 하는 경우가 있습니다. 이런 경우..

diy-dev-design.tistory.com

 

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

 

C# .net으로 photoshop 연동하기

저는 회사에서 디자인팀에 있고 전공도 디자인과 출신이며 심지어는 고등학교도 예체능계열 고등학교를 나왔습니다만 지금 회사에서 하는일의 95% 정도는 개발을 하고 있습니다. 실제로 제가 ��

diy-dev-design.tistory.com

 

반응형
반응형

포토샵의 가장 중요한 핵심 기능중의 하나가 레이어라는 구조일 것입니다. 이미지를 계층적으로 쌓아 올리고 각각의 이미지간 효과를 적용하거나 투명도등을 조절하여 완성된 하나의 이미지를 만들어 내는 것이죠. 

오늘 강좌에서는 포토샵에 레이어를 생성하고, 이름을 붙이거나, 위치를 이동하는 등의 레이어를 관리하는 기능을 소개해 드릴까 합니다.

오늘 강좌에서 다룰 내용은 아래와 같습니다.

  • 이미 있는 레이어를 복제하기, 위치 조정하기, 투명도 조정하기
  • 이미 있는 레이어의 순서 변경하기(이동하기)

 

먼저 포토샵 스크립트 작성을 위하여 extend script toolkit 을 실행합니다.

그리고 당연히 포토샵 어플리케이션을 열어야 겠죠. 

오늘은 제가 좋아하는 traxxas 로고를 이용하여 코드 연습을 해보겠습니다.

이 로고 이미지를 이용하여 wallpaper 를 한번 만들어 보겠습니다. 손으로 하자면 아주 귀찮을 그림을 만들어 보겠습니다.

//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);


app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_1_1";

오늘 강좌의 핵심이되는 부분은 요 부분입니다.

var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

logoImg 파일의 0번째 레이어를 복사하는 명령어죠. duplicate 뒤에 오는 값들은 어디에 복사할 것인지를 지정합니다. 첫번째 인자는 복제될 대상을 지정합니다. 이번 예제에서는 다른 PSD 파일 (배경화면용 이미지)의 0번째 레이어가 대상이 되었습니다. 그뒤에 오는 인자는 지정한 대상과의 관계인데요. 이번 예제에서 사용한 것은 "대상 예제의 바로 전에 위치시켜라" 라는 명령입니다.

ElementPlacement 라는 개체의 하위 옵션으로 몇가지 옵션을 지정할 수 있는데요. PS 버전이 올라가면서 옵션이 많이 다양해 졌습니다. 필요한 위치에 맞추어 넣으시면 되겠습니다.

ElementPlacement.PLACEAFTER         //cs6 - 대상개체 아래에
ElementPlacement.PLACEATEND         //cs6 - 대상개체의 제일 마지막에
ElementPlacement.PLACEBEFORE        //cs6 - 대상개체의 바로 위에
ElementPlacement.INSIDE             //cc - 대상이 폴더인 경우 폴더 안에
ElementPlacement.PLACEATBEGINNING   //cc - 대상 개체의 제일 처음에

 

어쨌든 요기까지 스크립트를 실행해보면 아래와 같은 그림이 만들어 집니다.

스크립트를 이용해 포토샵 psd 파일에 다른 파일의 이미지를 레이어로 복사한 상태

화면에 로고 이미지가 붙었죠?

요 이미지를 화면에 쫙 깔아 보겠습니다. 손으로 하려면 매우 귀찮은 작업이죠.

위에 작성한 코드를 포함하여 추가한 코드는 아래와 같습니다.

//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_def";

// 이제 화면에 로고 이미지를 가득 채워 넣자

//각 로고 간의 간격을 설정해주자
var gapWidth = 100;
var gapHeight = 100;

// 로고 이미지의 영역을 구한다. bounds 는 레이어내의 이미지 영역 정보를 가져온다
var logoBounds = newLogoLyr.bounds; //영역 정보는 [left, top, right, bottom] 순으로 들어온다.
var logoWidth = logoBounds[2] - logoBounds[0]; // 레이어의 가로 크기
var logoHeight = logoBounds[3] - logoBounds[1]; // 레이어의 세로크기

// 화면 영역내에 몇개의 로고가 들어갈 수 있는지 계산한다.
var numWidth = wallPaperPsd.width / (logoWidth + gapWidth)
var numHeight = wallPaperPsd.height / (logoHeight + gapHeight)

// 가로, 세로로 로고를 복사하여 붙여 넣는다.
for (var yy = 0; yy < numHeight ; yy++) // 세로 개수만큼 반복
{
    for (var xx = 0; xx < numWidth; xx++) // 가로 개수만큼 반복
    {
        var tmpLyr = newLogoLyr.duplicate(newLogoLyr, ElementPlacement.PLACEBEFORE);
        tmpLyr.translate(xx * (logoWidth + gapWidth), yy * (logoHeight + gapHeight))
        tmpLyr.name = "logo_" + xx + "_" + yy ;
    }    
}

 

로고 이미지를 가로세로로 100px 씩 간격을 띄고 화면에 꽉 채우는 스크립트가 되었습니다.

이렇게하면 아래와 같은 그림이 만들어 집니다.

traxxas 로고로 꽉 채워진 이미지가 만들어 졌다.

네 그런데 약간 아쉬운건 로고가 약간 치우쳐져서 배치가 되었네요.

그리고 약간 단조로워 보이는 듯 합니다. 그리고 바탕화면에 사용할 그림인데 너무 강렬한 감이 있습니다.

자 코드를 좀 수정해 보겠습니다. 이제 코드가 제법 길어지므로 집중해서 보셔야 합니다.

var currentUnitValue = app.preferences.rulerUnits

// 포토샵 유닛을 픽셀로 변경
app.preferences.rulerUnits = Units.PIXELS;



//로고파일의 위치를 설정한다
traxxasLogo_250_File = "D:/01_works/용/DIY_HARD_RC/traxxas_LOGO_125x25.png"
var logoFile = new File(traxxasLogo_250_File);

// 포토샵에 새로운 도큐먼트를 생성한다. 크기는 1920 1080
var wallPaperPsd = app.documents.add(1920,1080,72)

// 검정색 컬러를 정의한다
var newColor = new SolidColor();
newColor.rgb.red = 0;
newColor.rgb.green = 0;
newColor.rgb.blue = 10;

// 배경색상을 검정색으로 fill 한다
wallPaperPsd.selection.selectAll();
wallPaperPsd.selection.fill(newColor);
wallPaperPsd.selection.deselect();

// 로고 이미지를 열어서 배경화면용 포토샵으로 복사한다. 
var logoImg = app.open(logoFile);
var newLogoLyr = logoImg.layers[0].duplicate(wallPaperPsd.layers[0], ElementPlacement.PLACEBEFORE);

app.activeDocument = logoImg;
// 로고 파일은 닫는다.
logoImg.close();

app.activeDocument = wallPaperPsd;
//복사한 레이어의 이름을 변경한다.
newLogoLyr.name = "logo_def";

// 이제 화면에 로고 이미지를 가득 채워 넣자

//각 로고 간의 간격을 설정해주자. 숫자가 작을 수록 촘촘해지고 클수록 듬성듬성 붙는다.
// 포토샵 스크립트 실행 속도가 느리므로 너무 작은 숫자는 넣지 말자.
var gapWidth = 100;
var gapHeight = 100;

// 로고 이미지의 영역을 구한다. bounds 는 레이어내의 이미지 영역 정보를 가져온다
var logoBounds = newLogoLyr.bounds; //영역 정보는 [left, top, right, bottom] 순으로 들어온다.
var logoWidth = logoBounds[2] - logoBounds[0]; // 레이어의 가로 크기
var logoHeight = logoBounds[3] - logoBounds[1]; // 레이어의 세로크기

// 화면 영역내에 몇개의 로고가 들어갈 수 있는지 계산한다.
var numWidth = Math.floor(wallPaperPsd.width / (logoWidth + gapWidth));
var numHeight = Math.floor(wallPaperPsd.height / (logoHeight + gapHeight));

// 가로, 세로로 가득 찼을때 남는 공간을 계산하여 offset 을 만들어 주자
var offsetX = Math.floor(wallPaperPsd.width - (numWidth * (logoWidth + gapWidth) - gapWidth));
offsetX = offsetX * 0.5;

var offsetY = Math.floor(wallPaperPsd.height - (numHeight * (logoHeight + gapHeight) - gapHeight));
offsetY = offsetY * 0.5;

// 투명도를 조절하기 위한 값. 여기서 설정한 값에 의해 투명도가 자동으로 조절되어 아래로 내려갈 수록 투명해 진다. 
var maxOpacity = 50;
var minOpacity = 15;

// 각 단계별 투명도 변이 값을 계산하자.
var opacityStep = (maxOpacity - minOpacity) / numHeight

// 가로, 세로로 로고를 복사하여 붙여 넣는다.
for (var yy = 0; yy < numHeight ; yy++) // 세로 개수만큼 반복
{
    for (var xx = 0; xx < numWidth; xx++) // 가로 개수만큼 반복
    {
        var tmpLyr = newLogoLyr.duplicate(newLogoLyr, ElementPlacement.PLACEBEFORE);
        wallPaperPsd.activeLayer = tmpLyr; // 처음 레이어가 계속 활성화 되는 것을 막기 위하여 활성화된 레이어를 현재 복사된 레이어로 지정
        tmpLyr.translate(-logoBounds[0], -logoBounds[1]); // 복사된 레이어를 0,0 으로 이동시킴
        tmpLyr.translate((xx * (logoWidth + gapWidth)) + offsetX, (yy * (logoHeight + gapHeight)) + offsetY) // 지정된 위치로 이동
        tmpLyr.name = "logo_" + xx + "_" + yy ;
        
        tmpLyr.opacity = maxOpacity - (yy * opacityStep); // 아래로 갈 수록 투명하게
        // tmpLyr.opacity = minOpacity + (yy * opacityStep); // 위로 갈수록 투명하게 하려면 주석을 풀어 줍니다.
    }    
}
//처음에 복사한 레이어는 필요 없으니 숨겨줍니다.
newLogoLyr.visible = false;

//유닛을 스크립트 실행 이전상태로 복구함
app.preferences.rulerUnits = currentUnitValue;




 

이제 스크립트는 아래로 복제해 나가면서 점차 투명도를 주어 서서히 보이지 않도록 하고 있습니다. 이 투명도로 사용자가 설정한 최대값과 최소값을 이용하여 점차 변화하도록 하고 있습니다. 

간격을 조정하여 촘촘하게 배치하거나 듬성듬성 배치하더라도 의도한데로 서서히 변화가 적용될 것 입니다.

적용된 화면을 다시 볼까요?

화면에 격자형으로 배치되지만 아래로 갈수록 투명도가 높은 상태가 되었다.

 

이렇게 하면 스크립트의 일부만 수정하여 다양한 화면을 만드는 것이 가능합니다.

반복하여 붙여넣을 파일의 경로, 반복 간격, 투명화 정도를 설정하는 것으로 다른 이미지에도 동일하게 적용이 가능합니다. 본 예제에서는 1920 1080 사이즈의 이미지로 제작하였지만 다른 사이즈를 입력하여도 아마 정확하게 동작할 것입니다. 

여기에 마지막으로 화면 가운데에 좀 더 커다란 로고를 넣는다면 어떻게 해야 할까요?

직접 한번 도전해 보시면 어떨까요?

[wallpaper] traxxas logo 1920 x 1080
[wallpaper] traxxas UDR 1920 x 1080

 

감사합니다. 그럼 이만~

 

레이어 위치 이동하는 스크립트는 여기에도 있었죠? ^^

https://diy-dev-design.tistory.com/46

 

[포토샵스크립트] 현재 레이어 이미지를 중앙으로 이동시키기

안녕하세요. 오늘은 선택된 레이어를 화면의 중앙으로 이동시키는 포토샵 스크립트를 작성해 보겠습니다. 와이프가 한동안 쇼핑몰 상세페이지 디자인 작업을 재택근무 형식으로 했었는데요. 옆에서 작업하는 것을..

diy-dev-design.tistory.com

 

반응형

+ Recent posts