2017-03-09 12 views
-1

사용자가 이미지를 자르고 해당 이미지의 테두리를 선택할 수있는 앱을 개발 중입니다. 경계 스타일이있는 이미지를 Javascript를 통해 base64로 변환 할 수 있다면 알고 싶습니다.이미지를 Base64로 변환 테두리 이미지 스타일 포함

var img = new Image(); 
img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'; 
var pat = canvasContext.createPattern(img,"repeat"); 
canvasContext.strokeStyle = pat; 
canvasContext.lineWidth = 5; 
canvasContext.strokeRect(-(this.rotatedOffset.x * exportZoom), -(this.rotatedOffset.y * exportZoom), canvas.width, canvas.height); 

위의 코드는 검은 색 테두리를 캔버스에 추가합니다.

이제 이미지/패턴을 캔버스 테두리로 추가하고 싶습니다.

업데이트 : @ K3N의 답변에 따라 자른 이미지로 새 캔버스를 만들고 패턴 테두리를 추가했습니다. 내 필요를 위해 일했습니다.

+0

확실히 가능합니다. 테두리와 이미지를 캔버스에 그릴 수 있습니다 (테두리 크기를 고려한 캔버스 컨텍스트를 만들어야 할 수도 있음). 그런 다음 Cropit에 유사한 방법을 사용하여 내보낼 수 있습니다. 답장을 보내 주셔서 감사합니다. – Dan

+0

내 주요 문제는 자르고 이미지에 CSS 테두리 이미지를 추가하고 모두를 base64로 내보내려는 것입니다. 캔버스에 간단한 테두리를 추가 할 수 있지만 복잡한 이미지 패턴을 테두리로 추가하고 싶습니다. 어떻게 그걸 성취 할 수 있니? 나는 나의 질문을 업데이트했다. – Ricky

+0

CSS에서이 작업을 수행 할 필요가 없습니다. CSS 스타일을 에뮬레이션해야합니다 (DOM 요소 나 스타일에서 비트 맵을 직접 저장할 수 없으므로 포함 된 모든 문제가있는) 캔버스로 전송하므로 CSS를 사용하지 않고 직접 테두리를 캔버스에 추가하는 것이 더 간단합니다. CSS를 사용하여 큰 원을 그리십시오. – K3N

답변

1

나는 캔버스에 직접이 일을 추천 할 것입니다. DOM + CSS는 캔버스에서 드로잉을위한 비트 맵으로 쉽게 전송할 수 없기 때문에 CSS 스타일을 시뮬레이션하는 대신 캔버스에 직접 그려서 캔버스에서 드로잉을 끝낼 수도 있습니다.

캔버스에서 패턴을 사용할 수 있지만 이미지가로드 될 때까지 기다리는 것이 중요합니다. 이미지 로딩이 비동기이며 createPattern()으로 전화를 걸면 이미지가로드 및 디코딩되지 않아 빈 패턴이 생성 될 수 있습니다. 간단하게 확인하기 위해로드 이벤트를 사용

var img = new Image(), pat; 
img.onload = function() {       // wait for image to load 
    pat = canvasContext.createPattern(this, "repeat"); // image is ready (here "this") 
    canvasContext.strokeStyle = pat; 
    canvasContext.lineWidth = 5; 
    canvasContext.strokeRect(-(this.rotatedOffset.x * exportZoom), -(this.rotatedOffset.y * exportZoom), canvas.width, canvas.height);  
    // next step (if any) from here ... 
}; 
img.src = 'https://mdn.mozillademos.org/files/222/Canvas_createpattern.png'; 

물론이 경계가 적용되기 전에 캔버스에 그려진 이미지에 적용됩니다. 이러한 이유로 캔버스에 필요한 모든 이미지를 미리로드하여 올바른 그리기 순서를 보장 할 것을 권장합니다.

+0

감사합니다. @ K3N, 현재 작동 중입니다. 제가 알아챈 것은 이미지가 테두리 폭에 비례하지 않는다는 것입니다. 이것을 할 수있는 방법이 있습니까? 다시 말하면, que 패턴의 이미지를 테두리 너비에 맞 춥니 다? 예 : http://imgur.com/sV35utX – Ricky

+0

@Ricky 최신 브라우저는 패턴 개체에서 setTransform을 지원합니다.이 개체는 f.ex를 허용합니다. 패턴을 적용하기 전에 패턴의 크기를 조절하십시오. 당신은'var f = dstWidth/img.width;를 시도 할 수 있습니다. pat.setTransform (f, 0,0, f, 0,0);'(그리고 필요하다면 y에 대해서). 브라우저가 지원하지 않으면 원하는 패턴 크기로 오프 스크린 캔버스를 만든 다음 크기 조정 된 이미지를 그린 다음 해당 캔버스를 패턴 소스로 사용하십시오. – K3N

+0

setTransform() 함수를 사용하려고했지만 다음 오류가 발생합니다. .setTransform은 함수가 아닙니다 (Chrome에서 테스트 중입니다). 어느 쪽이든, 내 주요 문제를 해결하기 때문에 귀하의 대답을 올바른 것으로 표시했습니다. – Ricky

1

Croppie을 사용해보세요. 결과적으로 자른 이미지가 base64 인 jQuery 플러그인입니다.

https://foliotek.github.io/Croppie/

내가 지금이 아닌 JQuery와 버전을 가지고 있지 않지만, Croppie 괜찮은이다.

enter image description here

+0

답장을 보내 주셔서 감사합니다. 이 플러그인을 사용해 보았지만 AngularJS와 제대로 작동하지 못해서 Cropit과 함께갔습니다. 그럼에도 불구하고, 내 문제는 이미지 자르기 플러그인이 아니지만, CSS border-image 스타일로 이미지를 base64로 변환하는 방법입니다. 내 질문이 업데이트되었습니다. – Ricky

+1

@ricky - 죄송합니다. croppie에 파일을 바인딩하는 것이 번거롭다는 것을 알고 있습니다. 그러나 ng-1.4.x에 대한 ngcroppie 지시어가 있음을 알고 있습니다. –

+0

나는이 지시어를 사용했지만, 버전 1.6.x에는 몇 가지 문제가있는 것 같습니다. 향후 프로젝트를 위해 모듈을 더 자세히 살펴 보겠습니다. – Ricky