2010-12-22 3 views
10

Java (최신 버전 6u23)에서 불투명 한 텍스트를 렌더링하는 동안 하위 픽셀 AA가 잘 사용되지만 반투명 텍스트는 렌더링되지 않는다는 것을 발견했습니다.자바가 서브 픽셀 AA를 사용하여 반투명 텍스트를 렌더링 할 수 있습니까?

서브 픽셀 AA :

alt textalt text

색상 만이 0xBFFFFFFF에 0xFFFFFFFF로 변경되었습니다있는 같은 텍스트 :

alt textalt text

당신이 볼 수 있듯이, 반투명 텍스트는 분명히 표준 AA이며 깨끗한 반투명 렌더링이 아니라 끔찍한 '90 년대'스파이더 리 '모양을 가지고 있습니다.

일반적으로 하위 픽셀 AA의 기술적 한계 또는 Java의 버그로 인한 것입니까? 아니면 자바가 반투명 텍스트를 시도하지 않았거나 뭔가 놓친 것입니까?

Object oaa=disableGeneralAA(gc); 
... 
gc.drawString(tl,xx,(ty+(xa*met.getHeight()))); 
restoreGeneralAA(gc,oaa); 

... 


static private volatile boolean   hasRenderingHints=true; 

// ***************************************************************************** 
// STATIC INIT & MAIN 
// ***************************************************************************** 

// ***************************************************************************** 
// STATIC METHODS 
// ***************************************************************************** 

/** 
* Disable the general anti-aliasing rendering hint, returning whether the old value was RenderingHints.VALUE_ANTIALIAS_ON. 
* <p> 
* This method is needed for text rendering due to a bug in AWT; as of Java 6_20 when general AA is on text is not rendered using subpixel 
* AA, so general AA has to be turned off before rendering text and turned back on when done. This method abstracts that work and deals 
* with the possibility that the JVM does not support rendering hints, such as is the case with JME JVMs. 
*/ 
static public Object disableGeneralAA(Graphics2D gc) { 
    Object        old=null; 

    if(hasRenderingHints) { 
     try { 
      old=gc.getRenderingHint(RenderingHints.KEY_ANTIALIASING); 
      gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); 
      } 
     catch(NoClassDefFoundError thr) { hasRenderingHints=false; } 
     catch(NoSuchFieldError  thr) { hasRenderingHints=false; } 
     catch(NoSuchMethodError thr) { hasRenderingHints=false; } 
     } 
    return old; 
    } 

/** 
* Disable the general anti-aliasing rendering hint, returning whether the old value was RenderingHints.VALUE_ANTIALIAS_ON. 
* <p> 
* This method is needed for text rendering due to a bug in AWT; as of Java 6_20 when general AA is on text is not rendered using subpixel 
* AA, so general AA has to be turned off before rendering text and turned back on when done. This method abstracts that work and deals 
* with the possibility that the JVM does not support rendering hints, such as is the case with JME JVMs. 
*/ 
static public void restoreGeneralAA(Graphics2D gc, Object val) { 
    Object        old=null; 

    if(hasRenderingHints && val!=null) { 
     try { gc.setRenderingHint(RenderingHints.KEY_ANTIALIASING,val); } 
     catch(NoClassDefFoundError thr) { hasRenderingHints=false; } 
     catch(NoSuchFieldError  thr) { hasRenderingHints=false; } 
     catch(NoSuchMethodError thr) { hasRenderingHints=false; } 
     } 
    } 
+0

안티 앨리어싱 된 텍스트를 'BufferedImage'에 렌더링 한 다음'AlphaComposite '를 사용하여 이미지를 화면에 반투명하게 그려 보았습니까? (불행히도 더 느려질 것입니다.) – finnw

+0

@finnw : 모든 페인팅은 오프 스크린 BufferedImage로 이루어지며, 그 이미지는 간단한'gc.drawImage'를 사용하여 각 페인트 (그래픽 agc)의 기본 스크린 그래픽 콘텍스트로 복사됩니다. . 나는 오프 스크린 버퍼의 이미지가 최종 이미지가 될 것으로 기대한다. 나는 반투명 한 페인팅을 많이하고 유일한 문제는 텍스트 색이 반투명 할 때 텍스트 렌더링이 표준 AA로 보인다는 것입니다. –

+0

잠시 동안이 문제가 발생했습니다. http://forums.java.net/node/676951 – z5h

답변

0

내가 생각 렌더링


그래픽 초기화

dbGraphics=(Graphics2D)dbImage.getGraphics(); 
if(dctRoot.properties.getBoolean("Antialias",true)) { 
    try { 
     Map hnts=(Map)(dctRoot.awtComponent.getToolkit().getDesktopProperty("awt.font.desktophints")); 

     // SET AA ON OVERALL (NOTE: GENERAL AA MUST BE OFF FOR SUBPIXEL AA TO BE HONORED - TEXT WIDGETS MUST DO THIS THEMSELVES) 
     dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

     if(hnts!=null) { 
      // SET FONT RENDERING HINTS FROM DESKTOP 
      dbGraphics.addRenderingHints(hnts); 
      } 
     else { 
      try { 
       // SET TEXT AA TO FONT-SPECIFIED GASP AA (JAVA 6+) 
       dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); 
       } 
      catch(Throwable thr3) { 
       // SET TEXT AA TO DEFAULT 
       dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
       } 
      } 
     } 
    catch(Throwable thr) { 
     dctRoot.log.println("Antialiasing not supported on this JVM ("+thr+")."); 
     dctRoot.setProperty("Antialias","False");   // turn off AA for subsequent painting 
     } 
    } 
else { 
    try { 
     dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_OFF); 
     dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_OFF); 
     } 
    catch(Throwable thr) {;}        // ignore exception 
    } 

텍스트는 당신의 글꼴 스타일에서 포인트를 취 GASP을 사용하기 때문이다. VALUE_TEXT_ANTIALIAS_DEFAULT 및 VALUE_ALPHA_INTERPOLATION_DEFAULT을 (를) 사용해 보셨습니까? 그것은 가치가있다. 이러한 버그 리포트에서 볼 수 있듯이

http://download.oracle.com/javase/6/docs/api/java/awt/RenderingHints.html

+0

아니요, 하위 픽셀 AA를 사용하고 있습니다. GASP는 데스크톱 렌더링 힌트가 반환되지 않는 경우를 대비 한 대안 일뿐입니다. 이것은 스크린 샷에 의해 시연됩니다. 두 가지의 * 유일한 차이점은 렌더링에 사용되는 색상입니다. –

0

Jav 버전을 사용하고 있습니까? 너는 말하지 않는다. 그러나 분명히이 6 업데이트 12 (J6u12) 또는 JDK7 B43

중 하나를 자바로 수정되었습니다 여기를 참조하십시오 : http://bugs.sun.com/view_bug.do?bug_id=6749060

만약 J6u12에 비해 여전히이 버그를 참조하여 다시 자바 테스트 = 이상 Sun 's 버그 데이터베이스에서 의견을 말할 수있는 RFE입니다.

자바 플랫폼에 고정 된 물건을 얻을 수있는 방법입니다에 다음 중 하나

  1. Sun's BugParade의에서 버그 리포트, 우선 순위를 높이고, 썬/오라클 프로그래머가 될 때까지 기다릴에 투표 그것에게 또는
  2. 자바가 오픈 소스이므로, 직접 고치십시오. (ho의 메일 링리스트에 가입하십시오.ho.io/jkp2

    : 당신이 투표 또는 언급 할 BugParade의 보고서는 (경우에 당신이 여전히 존재 j6u12 키우면으로 테스트) 여기

:-) IO가/jkp5는 URL입니다

당신은 텍스트조차 해결 방법 여기에서 제공되는 이전의 JRE에 좋은 보이는 있도록-를 해결하려면 알려져을 구현하려면

URL : ho.io/jkpy이

"내가 '솔루션 것 같은데 필요한 전경색과 배경색을 혼합하여 반투명을 모방하는 데 사용합니다. 네이티브 래스터 라이저가 사용되는지 확인하는 방법은 아직 없습니다. "

행운을 빈다.

+0

확실히 6.23으로 수정되지 않았습니다. 최신 JVM 및 JDK를 실행 중입니다. 나는 불투명하지 않은 대상에 대해 이야기하고 반투명 소스를 사용하고 있지만, 알파 블렌딩이 전혀 발생하지 않는 것이 문제라고 생각합니다. –

+0

그리고 테스트가 렌더링되는 배경이 다양하기 때문에 (이미지, 로고 또는 그라디언트이기 때문에) 모든 픽셀에서 작동 할 색상이 하나도 없으므로 스스로 반투명을하는 것은 의문의 여지가 없습니다. –

관련 문제