반응형

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

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

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

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

 

먼저 포토샵 스크립트 작성을 위하여 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

 

반응형
반응형
이번에는 트랙사스 UDR 의 라이트 셋을 만들어 볼 계획입니다. 무선으로 켜거나 끌수 있도록 할 예정이며 전면 헤드라이트 1쌍. 후면 브레이크등 1쌍. 운전석 내 실내등 및 주요 장비에 LED 등을 만들어볼 계획입니다. 그리고 이번 DIY 의 꽃은 운전석과 조수석에 디지털 디스플레이를 장착해볼 계획입니다. 그동안 어떤 트랙사스 UDR 에서도 볼수 없었던 튜닝이죠.

먼저 필요한 장비를 소개하겠습니다.
Arduino Nano x2
NRF24L01 x2
SSD1306 0.96inch OLED (i2c) x2
DC2DC voltage ragulater
Push 스위치
Toggle switch
LED (white SMD, 0.25w) x 28
LED (white DIP, 0.25w) x 8
LED (green DIP) x1
LED (RED DIP) x10
PCB (17x9, 0.25mm) x2

모든 부품은 알리익스프레스에서 구입하였으며 배터리는 버려진 무선 진공청소기에서 적출하였습니다.
먼저 가장 기본이 되는 하드웨어 부분 부터 만들어 보겠습니다.

헤드라이트 모듈 만들기
우선 디자인은 UDR 고유의 헤드라이트 모양을 살려서 만들기로 결심하였습니다.
시중에 판매하는 라이트 셋은 UDR 만의 특징을 살린 디자인이라고 보기는 어려웠기 때문에 이번 DIY 가 더 특별한것 같습니다.
먼저 도면을 만들어봤습니다. 그리고 LED 실장 위치도 배치해봤습니다.
배터리를 7.4v 2s 로 사용할 계획이기 때문에 LED 2개씩 직렬로 연결하였고 입력부는 5.5~6v 사이로 전압을 강하항 입력해 줄 계획입니다. 전원 입력은 알리에서 주문한 직류 전원 장치인데 입력 출력이 모두 DC 이며 중간에 가변저항을 돌리면 출력 전압이 변경됩니다. 저는 5.5v 에서 6v 정도로 맞출 계획입니다. 아무래도 방열을 하기 어려운 구조이기 때문에 정격 전압이 가해졌을때 열 때문에 문제가 될 수도 있겠다 싶었습니다.
중요한것은 LED 는 극성이 있기 때문에 부착하는 방향을 잘 맞추어 부착을 해야 합니다. SMD led 의 경우 위에서 봤을때 거무튀튀한 부분이 한쪽으로 쏠려 있는데요. 검은 점이 있는 쪽이 -극이 되겠습니다.

우선 만능기판에 LED 를 부착하여 보았습니다. 만능기판은 17x9 크기로 잘라 주었습니다.

SMD 부품의 경우 손으로 잡고 납땜을 하는 것이 불가능하기 때문에 연고처럼 짜서 사용할 수 있는 납을 이용하여 먼저 부착할 위치에 짜준후 LED 를 핀셋을 이용하여 살짝 얹어 놓으면 됩니다. 그런다음 열풍기를 200도 정도로 하여 가열해주면 납이 녹아 붙게 됩니다. 열풍기가 없으면 인두로 끝부분을 살짝 대고 있으면 납이 부글부글 끓으며 녹아 달라붙게 됩니다.
자 부착이 완료 되었고 배선도 끝냈습니다.

그럼 전원을 연걀하고 테스트를 해봐야겠습니다.

쨔잔

와 예쁘네요.
그런데 빛이 너무쎄서 주변까지 다 빛이 퍼지네요. 라이트 주변에 케이스를 만들어 빛이 옆으로 퍼지는것을 좀 막아 주어야 하겠습니다.
그리고 발열 테스트 하다가 문제가 발생되었습니다. 세번째 사진을 보면 유독 led 하나가 푸르고 밝게 빛나는게 보이시나요? LED 가 불량인지 해당 지점에서 열이 상당히 많이 나는지 시간이 지나면서 연기가 피어오르며 LED 가 사망하는 사건이 발생하였습니다. 아무래도 해당 LED 가 불량인것도 같고 직렬로 연결하면서 그라운드 선을 골고루 연결해주지 않아 전류가 과하게 인가된게 아닌가 추측을 해봅니다. LED를 교체하고 그라운드를 골고루 뿌려볼 예정입니다.

무선 송수신기 연결은 다음 포스트에서 

 

반응형
반응형

아재가 되며 일상이 무료해질 때 쯤 취미를 가져야 겠다고 생각해서 중국 발 싸구려 RC카 인 WPL 제품을 구입하여 한동안 재미있게 지냈다. RC 카의 송수신기도 직접 만들어 보고 모터도 바꿔보며 기어박스도 부착해보았다. 바퀴에서부터 각종 부품을 직접 바꿔보며 재미있게 놀았지만 항상 마음 한켠에 1:10 RC 카에 대한 로망은 사그러 들지 않았다. WPL의 장난감 같은 RC 카로는 채워지지 않는 어떤 자리가 있는 느낌?

 

사실 한동안은 어짜피 다 같은 RC 카인데 ... 크기만 차이가 있지 구조적으로는 다 비슷비슷한거 아닌가 생각도 했다. 그렇게 위안을 삼고 가지고 놀다가 금방 망가지고 나면 또 고치는데 몇달... 이건 재미도 재미인데 뭔가 채워지지 않는 빈자리가 있는 느낌이었다. 어쩌면 시간이 지날수록.. 

 

그런데 말입니다.

 

친구녀석이 생일 선물이라며 딱!

 

선물을 건내준것이 지난주. 

 

오메..... 눈물이 나는 줄 알았다.

traxxas UDR 아닌가! UDR 은 Unlimited Desert Racer 의 약자인데. 간단히 말하면 사막용 오프로드 차량 정도 되겠다. 크기는 1:7 의 어마 무시한 크기이고 가격도 상당하다. 사실 RC카 유저들의 끝판왕 같은 존재랄까? 이런 제품이 내손에 들어오다니 믿을 수가 없었다.

 

와우!

 

박스 크기부터 장난이 아닌 것이다. 지금껏 살면서 가져본 가장 큰 박스의 장난감이랄까?

가격이 백만원이니 사실 장난감이라고 하기에는 선을 넘었다고 봐야겠지만..

 

 

차량을 꺼내보았다. 

거의 박스 크기에 가까운 차량이다. 빈공간이 거의 없고 정말 차량이 꽉 차있다.

 

 

이 압도적인 포스!

 

정말 유튜브 동영상을 수도 없이 보며 침만 흘리던... 나중에 취미생활에 돈좀 쓰게되더라도 과연 이녀석을 살까 싶었던 바로 그 UDR 이 내 눈앞에 있었다.

 

 

진짜 넘나 멋진것. 카울은 주황색 버전인데 레드 (RIGID) 버전도 있다. 개인적으로는 주황색 버전이 좀더 예쁜 듯.

 

 

뒤로 보이는 65인치 TV와 비교해 보면 얼마나 큰지 감이 오려나?

 

정말 압도적인 포스.

 

상세 사진을 좀 보여드리겠다.

 

바퀴는 약 130mm 크기의 한덩치 하는 바퀴가 달려있다.

타이어는 BFGoodrich 사의 타이어가 달려있는데 해당 회사 로고는 차량 여기저기 스티커로도 붙어있다.

타이어의 주황색 띠는 스티커이고 아마 본드로 붙여져 있는 것 같다. 

 

 

 

아래 사진은 전륜쪽 서스펜션이다. 전후륜 모두 바퀴당 두개의 서스펜션이 장착되어 있는데 각각의 서스펜션은 큰충격, 작은 충격을 나누어 흡수함으로써 일반적인 차량에서 보이는 꿀렁꿀렁하는 모습은 찾아볼 수 없다. 50cm 정도의 높이에서 떨어뜨려도 전혀 꿀렁이지 않고 모든 충격을 흡수한뒤 차량의 포지션을 원상태로 회복시킨다.

 

 

카울을 벗겨 보았다. 암만 RTR 이라고 해도 우린 또 그냥 넘어갈 수 없는 부분아니겠는가

 

14개의 나사를 풀어야 하는데 해당 나사를 풀기 위한 육각 렌치는 박스안에 잘 들어 있으므로 별도의 공구는 필요치 않다.

 

카울을 벗기고 나면 아래와 같은 모습이다.

읭! 뭐야 이거. 너무 멋지자나! ㅋㅋ

이거뭐 카울 없는게 더 멋있는거 같기도 하다.

 

TRX4 나 SCX10 계열과는 달리 프레임 형식이 아니다. 실제 차량과 같이 차량을 구성하는 프레임이 있고 거기에 실제 차와 같이 카울이 씌워지는 형태로 제작이 되어 있다. 유튜브에 보면 이런 모습으로 올라와있는 영상도 꽤 있는 것을 보면 내눈에만 멋져 보이는 것은 아닌가 봥

 

배를 보자

캬~~ 이 깨끗한 배때기.. 한번만 주행을 해도 이런 배는 못보겠지.

 

위쪽에 베터리 수납 공간이 있는데 현재 해당부분 커버를 벗겨놓은 상태이다.

 

지금 바닥부분 판때기는 동봉되어 있는 육각 렌치를 이용하여 쉽게 탈거가 가능하다.

 어마무시하게 큰 브러시리스 모터가 들어있다.아래쪽에는 전륜 조향용 서보모터가 장착되어 있는데 그 욕많이 먹는 트랙사스의 서보인지는 잘 모르겠다. 고장나면 바꿔야 할테니 남들 다 산다는 알리 20kg 서보를 미리 하나 사두어야 겠다.

 

이 차량에는 기본적으로 운전석과 보조석에 사람이 들어있다. 실제 피규어는 아니고 카울 처럼 껍데기만 있는 사람인데 디테일이 상당하다.

 

번쩍 번쩍 광빨이 나는게 좀 그렇긴 한데 되게 느낌있고 멋진 모습이다. 스티어링 휠(핸들)에 노란색 표시도 실제 랠리 차량에 있는 핸들 중립 확인용 띠를 재현해 놓은 것이다.

 

정말 아름답지 않은가. 

 

다시 카울을 씌우고 

 

 

가운데 보이는 철자가 30cm 자 임을 생각하면 크기가 어느정도 인지 감이 오시는가

맨날 1:16 차량만 봐서인지 정말 괴물같은 크기이다. 감동! 창수야 고맙다.

 

이건 뭐 사진을 그냥 막 찍어도 예술이다.

 

 

그동안 나랑 좋은 시간을 보냈던 WPL C24 와도 한컷. ㅋㅋ 애기 같음

 

 

 

여기까지 일단 리뷰를 마치고 다음 포스트에서는 배터리와 각종 사용 설명 관련 부분, 실제 주행하는 모습을 준비해서 보여드리겠습니다.

 

아 다시봐도 감동이 사그러 들지 않네요.

반응형

+ Recent posts