2016-07-04 7 views
0

이 코드를 사용하여 JDenticon으로 웹 사이트를 생성하고 있습니다 (test.html를)를 저장 이 코드에서 생성 된 이미지를 Java 데스크탑 응용 프로그램이 액세스 할 수있게하고 내 PC에 저장하려고합니다. 가능하고 아마도 코드를 변경하는 것일 수도 있습니다 (ff8adece0631821959f443c9d956fc39)자바 (데스크탑)를 사용하여 웹 사이트에서 SVG 이미지

그리고 코드는 무엇입니까?

편집 # 1 : 내가 싶었

var engine = new Jurassic.ScriptEngine(); 
engine.ExecuteFile("<path to jdenticon.js>"); 
engine.SetGlobalValue("size", 200); 
engine.SetGlobalValue("hash", "ff8adece0631821959f443c9d956fc39"); 

var svg = engine.Evaluate<string>("jdenticon.toSvg(hash, size)"); 
File.WriteAllText("testicon.svg", svg); 

:

I는 다음과 같습니다 및 .NET 프레임 워크에 사용되는 JDenticon의 API에서 뭔가를 발견했습니다 Java에서 이와 같은 작업을 수행하고 Java ScriptEngine (자습서 : Oracle)을 찾았습니다. 그러나 나는 그것을 사용하는 방법을 모르겠어요, 지금 내 코드는 다음과 같습니다가 jdenticon.toSvg (해시, 크기) 방법을 호출하지 않기 때문에

ScriptEngineManager factory = new ScriptEngineManager(); 
ScriptEngine engine = factory.getEngineByName("JavaScript"); 

engine.put("size", 200); 
engine.put("hash", "ff8adece0631821959f443c9d956fc39"); 

String svg = (String) engine.eval(new java.io.FileReader("C:/jdenticon.js")); 

이 분명히 작동하지 않습니다 jdenticon.js 파일. 그래서 누군가가이 문제를 해결하는 방법에 대한 생각을 갖고 있다면 아주 좋을 것입니다.

+1

'JDenticon' 문서를 읽었습니까? – amn

+0

@ amn 글쎄, 내가 가지고 있지만 자바에 대한 해결책을 찾지 못한 것 같아요. – JetStream

+0

Java? JDenticon은 JavaScript 라이브러리입니다. 클라이언트 측에서 작동합니다. 즉, Node.js를 통해 서버 측에 아이콘을 렌더링 할 수 있다고 생각합니다. 아이콘을 자바 애플리케이션으로 렌더링하려면 JDenticon을 Java 소스 코드로 이식해야합니다. 또한 아이콘에 SVG를 사용할 필요가 없다는 것을 명심하십시오. JDenticon 페이지에서도 설명 된'canvas'를 사용할 수 있습니다. – amn

답변

2

Java SE에 내장되어있는 JavaScript 인터프리터에서 원래 코드를 실행하는 흥미로운 아이디어가 포함 된 업데이트 된 질문을 통해 내가 SVG를 생성하기 위해 테스트 한 다음 코드를 얻게되었습니다. 적어도 내 컴퓨터에서 예상 SVG 아이콘 이미지를 생성하는 문서 텍스트

import java.io.FileNotFoundException; 
import java.io.FileReader; 
import javax.script.*; 

public class JDenticonClient { 
    public static void main(String args[]) throws FileNotFoundException, ScriptException { 
     String svgText = new JDenticonClient().getSVGDocumentText("ff8adece0631821959f443c9d956fc39", 200); 
     System.out.print(svgText); 
    } 
    public String getSVGDocumentText(String hash, int size) throws FileNotFoundException, ScriptException { 
     ScriptEngineManager factory = new ScriptEngineManager(); 
     ScriptEngine scriptEngine = factory.getEngineByName("JavaScript"); 
     scriptEngine.eval(new FileReader("jdenticon.min.js")); 
     return scriptEngine.eval("jdenticon.toSvg(\"" + hash + "\", \"" + size + "\")").toString(); 
    } 
} 

우리가 동일한 솔루션에 접근하더라도, 다음과 같은 고려해야합니다 :

  1. put 방법은 평가되는 스크립트 추가 스크립트 호스트 오브젝트를 표시합니다. 이것은 기본적으로 특정 API 세트 또는 Node.js 또는 이와 유사한 항목이있는 웹 브라우저가 아닌 사용자 정의 호스트가있는 스크립트 엔진을 사용하는 전체 지점입니다. 기본적으로 put 또는 을 사용하여 자신의 API를 만들 수 있습니다. 기존 API를 시뮬레이트합니다. 예, 전체 브라우저 API 세트를 복제하여 응용 프로그램 스크립트 호스트를 최신 브라우저와 호환되도록 만듭니다.
  2. 나는 평가 된 문자열 나 자신을 구성, 그러나 이것은 전문적이다 -뿐만 아니라 일한 것 put를 사용하여 스크립트에 각각 고유 hashsizeString로하고 int 객체를 노출,하지만 당신은 인 전역으로 그이 이들이 어떻게 toSvg 절차에 대한 자연적인 원샷 매개 변수인지를 고려할 때 항상 똑똑한 것은 아닙니다.
  3. JDenticon 스크립트 평가를 올바르게 포함 했더라도 기본적으로 스크립트를 포함 (및 실행)하는 것만으로 jdenticon 프로 시저를 호출하여 canvassvg 요소를 DOM 트리 안에 넣는 것을 고려하지 않았을 수 있습니다. 당신의 사건은 존재하지 않습니다. 사실, 나는 스크립트 파일의 내용에 대한 평가가 DOM에 대한 가정이 만들어지는 예외 때문에 중도에서 중단되지 않았다는 것에 깊은 인상을 받았습니다. 그러나 그 이유는 스크립트가 Node가없는 Node.js와도 작동하도록 만들어 졌기 때문일 것입니다.
  4. 위의 코드는 SVG를 생성해야 할 때마다 새 팩토리와 새 스크립트 엔진을 만들지 않아도되도록 최적화 할 수 있습니다. 나는 그것을 모두 운동으로 남겨 둡니다.
  5. getSVGDocumentText은 생성 된 전체 SVG 문서를 텍스트로 반환합니다. 예를 들어 원하는 경우 로직을 추가해야합니다. 상기 텍스트를 *.svg 파일에 저장하십시오.

P. 나를 ScriptEngine의 방향으로 가리켜 주셔서 감사합니다. Java가 하나 있다는 것을 알지 못했습니다. 잘 알고, 결코 알지 못한다.

+0

이 문제가 해결되어 대단히 감사합니다. 나는 또한 자바에서 코드를 ripment하려고 시도하고 속도에 큰 차이가 있는지 확인합니다. – JetStream

+0

의심 할 여지없이 - 스크립팅 호스트를 설정하고 사용하는 오버 헤드가 내가 생각하는 것 중 아주 작은 양을 실행하는 데 필요한 오버 헤드가 (컴파일되는 것과 반대되는) 코드로 해석 될 수있는 가능성은 결코 간단하지 않습니다. Java 코드 실행. 또한 그래픽 컨텍스트에 대한 의존성이 없기 때문에 벡터 그래픽 호출을 허용하는 인터페이스를 사용하여 사람들이 자신의 클래스를 구현할 수 있도록 일반화하는 것이 좋습니다. Github에 올려 놓으십시오. 아마도 JDenticon repo 자체와 병합 할 수 있습니다. 그리고 ... 이익! ;-) – amn