2014-05-23 4 views
14

HTML5 또는 Canvas (또는 다른 HTML5 기술)를 사용하여 투명하지 않은 영역의 색상을 변경하는 좋은 방법이 있습니까?투명 배경을 변경하지 않고 이미지 색상을 변환하십시오.

나는 많은 인터넷 검색 및 이미지, 등의 색상을 변경할 수 있습니다 (캔버스) 일부 솔루션,

Canvas - Change colors of an image using HTML5/CSS/JS?

How do i tint an image with HTML5 Canvas? 그러나이 솔루션은 또한에 투명 배경을 변경 발견 주어진 색깔 (나는 원하지 않는다).

Stackoverflow image with transparent pixel(background)

그것의 배경이 투명한 이미지를 PNG로 유래. 이제 투명 픽셀 (배경)에 영향을주지 않고 이미지 색상을 변경하여 새로운 색상으로 캔버스 toDataURL 메소드를 사용하여 이미지를 다시 저장할 수있게되었습니다.

HTML5가 있는지 여부는 확실하지 않습니다. 어떤 도움을 주셔서 감사합니다.

미리 감사드립니다. 편집을 할

******************* *********************

추가 Pill (capsule)의 새로운 이미지.

enter image description here

+0

이것은 정확히 당신이 찾고있는 것이 아니지만, 일반적으로 이미지 색상을 변경하기 위해 일반적으로하는 일은 조금 투명하게 만들고 배경 이미지 색상을 원하는 색상으로 설정하는 것입니다. – dcclassics

+0

@ dcclassics : 나는 당신이 나를 잘못 해석했다고 생각합니다. 나는 투명 픽셀을 가진 png 이미지를 가지고 있는데, 마리오 (만화 캐릭터) png 이미지를 보자. 마리오는 성격이 다항식이기 때문에. 이미지에는 투명한 픽셀이 있어야합니다. 이제 투명 픽셀을 변경하지 않고 캐릭터 (마리오)의 색상을 변경하고 싶습니다. –

+0

캔버스를 RGBA 값을 사용하여 픽셀 단위로 편집 할 수있는'canvas.getImageData'와'putImageData'가 필요할 것입니다. 시작하려면 [이 튜토리얼] (http://beej.us/blog/data/html5s-canvas-2-pixel/)을 참조하십시오. – apsillers

답변

26

데모 (이하이 데모에 대한주의 사항 참조) : 당신은 이미지의 RGBA 픽셀 데이터를 포함하는 배열을 얻을 수 http://jsfiddle.net/m1erickson/2d7ZN/

enter image description here

사용 context.getImageData

var imageData=context.getImageData(0,0,canvas.width,canvas.height); 

var data=imageData.data; 

거기에서 각 픽셀의 색을 읽고 선택적으로 변경할 수 있습니다.

는 RGBA 어레이가 다음과 같이 배치되어

// top-left pixel (x:0,y:0) 

data[0] red of pixel#0 (0-255) 
data[1] green of pixel#0 (0-255) 
data[2] blue of pixel#0 (0-255) 
data[3] alpha of pixel#0 (opacity: 0-255) 

// next pixel (x:1,y:0) 

data[4] red of pixel#1 
data[5] green of pixel#1 
data[6] blue of pixel#1 
data[7] alpha of pixel#1 

당신은 R, G, B 또는 데이터 배열 예

변화에 의한 화소의 구성을 변경할 수 있으며, 이러한 변경 투명성에 대해 빨간색으로

data[0]=255; // red 
data[1]=0;  // green 
data[2]=0;  // blue 
data[3]=255; // alpha (opacity) 

의 왼쪽 상단 픽셀 :

각 픽셀의 알파 구성 요소가 픽셀의 투명도를 결정합니다.당신은 단지 대부분 불투명 픽셀을 수정하려는 경우, 당신은 쉽게이 같은 모든 반투명 픽셀 무시할 수 있습니다 : 당신과 함께 캔버스에 다시 수정 된 픽셀을 밀어 수, 마지막으로

// alpha is 0-255 
// ignore pixels with alpha < 200 (ignore all pixels that are mostly semi-transparent) 

if(data[3]<200) { // don't process this pixel } 

.putImageData

context.putImageData(imageData,0,0); 
데모에 대한

참고

은 캔버스의 기본 RGBA 색 구성표를 사용하여 이미지 "칠"하기는 어렵습니다.

그래서이 데모는 RGB 데이터를 HSL 색 구성표로 변환합니다. 이렇게하면 픽셀의 다른 구성 요소 (S = 색상의 채도, L = 색상의 밝기)에 영향을 미치지 않고 "색상"(색조)을 변경할 수 있습니다.

픽셀이 다시 채워지면 수정 된 HSL 데이터가 다시 RGBA로 변환되어 데이터 배열에 저장됩니다.

+1

감사 마크. 그것의 아주 좋은 해결책. , 나는 아직도 문제로 고투하고있다. 나는 이미지에서 바꾸고 싶은 색을 모른다. 난 그냥 사용자가 이미지에 전달하는 색상을 추가하고 싶습니다 (원래 이미지 색상 + 사용자가 전달한 색상 혼합). –

+0

필 (캡슐)의 새로운 이미지를 추가했습니다. 사용자가 16 진수 형식으로 전달하는 색상을 변경하고 싶습니다. 그것에 대한 모든 안내는 훌륭 할 것입니다. Adv에 감사드립니다. –

+0

투명 픽셀의 알파 값은 0에 가깝고 (아마 0-10) 알파 값이 낮은 픽셀은 변경하지 마십시오. 귀하의 알 약 이미지가 밝고 어두운 색상. 알약의 어두운 부분을 변경하려면 낮은 rgb 값 (낮은 rgb 값 == 어두운 색상)으로 픽셀을 타겟팅하십시오. 알약의 밝은 부분을 변경하려면 높은 rgb 값을 가진 픽셀을 대상으로 지정하십시오. 내 대답과 마찬가지로 선택한 픽셀을 HSL로 변환하고 선택한 픽셀의 색상을 사용자가 전달한 색상 방향으로 이동해야합니다. 그렇게하면 이미지의 채도 및 밝기가 유지됩니다. – markE

관련 문제