2009-12-15 17 views
11

Khi tôi chạy các ứng dụng GUI swing của mình trong Java 6, chúng sẽ tự động sử dụng các cài đặt chống bí danh pixel phụ được cấu hình của tôi cho tất cả các phông chữ. Kết quả được cải thiện nhiều hơn so với các tùy chọn AA tiêu chuẩn.Làm cách nào tôi có thể kế thừa cài đặt chống bí danh của hệ thống để vẽ văn bản thành hình ảnh ngoài màn hình như xoay?

Nhưng khi tôi vẽ hình ảnh, tôi không thể tìm cách khởi tạo ngữ cảnh đồ họa để sử dụng cấu hình AA của hệ thống. Cố gắng để chơi xung quanh với các gợi ý AA khác nhau của Java là một nguyên nhân bị mất vì không có phương pháp pixel phụ sẽ làm việc cho tất cả người dùng.

Có cách nào để kế thừa cài đặt hệ thống AA cho ngữ cảnh đồ họa nhất định thay vì phải chọn một và đặt gợi ý rõ ràng không? Tại thời điểm này tôi phải sử dụng GASP AA để tránh những kết quả kinh khủng mà AA chuẩn đưa ra với các phông chữ nhỏ. Tôi đã cố gắng không đặt bất cứ điều gì cho văn bản AA, và không đặt bất kỳ gợi ý AA nào cả.


Cập nhật 2010-01-05

Tôi nghĩ Tôi đã ghim này xuống; các gợi ý AA subpixel chỉ xuất hiện để được tôn trọng khi vẽ trực tiếp vào bối cảnh đồ họa AWT; khi tôi vẽ hình ảnh đôi đệm, nó chỉ làm tiêu chuẩn AA; nhưng khi tôi bỏ qua hình ảnh bộ đệm đôi thì AA subpixel được thực hiện.

Nếu không câu trả lời của The_Fire sẽ hoạt động trong các JVM có Swing sẵn có (nhưng không phải J2ME JVM); Lưu ý rằng câu trả lời của The_Fire không hoạt động khi sử dụng thành phần AWT (sử dụng nhãn mới() thay vì JLabel() mới không thành công), có lẽ vì FontRenderContext không thể trích xuất cho đến khi thành phần được nhận ra màn hình.


mã hiện tại của tôi để có được những bối cảnh đồ họa cho hình ảnh mục tiêu của tôi hiện nay trông như thế này:

try { 
    if((dbImage=dctRoot.createImage(wid,hgt,1))!=null) {   // if createImage returns null or throws an exception the component is not yet displayable 
     dbGraphics=(Graphics2D)dbImage.getGraphics(); 
     if(dctRoot.properties.getBoolean("Antialias",true)) { 
      try { 
       // set AA on overall 
       dbGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING  ,RenderingHints.VALUE_ANTIALIAS_ON); 
       // set text AA to platform/impl default 
       dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.VALUE_TEXT_ANTIALIAS_DEFAULT); 
       // try to override platform/impl AA with font-specified AA (Java 6+) 
       try { dbGraphics.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,RenderingHints.class.getField("VALUE_TEXT_ANTIALIAS_GASP").get(null)); } catch(Throwable thr) {;} // yes, ignore exception 
       } 
      catch(Throwable thr) { 
       dctRoot.log.println("Antialiasing not supported on this JVM ("+thr+")."); 
       dctRoot.setProperty("Antialias","False");   // turn off AA for subsequent painting 
       } 
      } 
     } 
    } 
catch(Throwable thr) { 
    dbImage=null; 
    dbGraphics=null; 
    } 

Mã để tạo ra các hình ảnh sử dụng một thành phần AWT cơ bản, hình thành trong bối cảnh mà tôi làm tất cả các bức tranh của tôi - thành phần là một Panel, bởi vì tôi cần để có thể làm một setFocusCycleRoot vì vậy nó chơi tốt với các thành phần AWT khác. Các mã tạo ra hình ảnh sau:

public DctImage createImage(int wid, int hgt, float accpty) { 
    GraphicsConfiguration    cfg=awtComponent.getGraphicsConfiguration(); 
    Image        img=null; 

    if(transparentImages) { 
     //y { img=new BufferedImage(wid,hgt,BufferedImage.TYPE_INT_ARGB); }  // NB: J2ME CDC/PP 1.1 does not have the BufferedImage constructors (one day I may discover a way to create a BufferedImage via another API!!) 
     try { img=cfg.createCompatibleImage(wid,hgt,Transparency.TRANSLUCENT); }// NB: J2ME CDC/PP 1.1 does not have this API, but prefer to use GraphicsConfiguration over new BufferImage(...) 
     catch(NoClassDefFoundError thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled 
     catch(NoSuchMethodError  thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled 
     catch(NoSuchFieldError  thr) { transparentImages=false; createImage(wid,hgt,accpty); } // try again with transparency disabled 
     } 
    else { 
     img=cfg.createCompatibleImage(wid,hgt); 
     } 

    if(accpty>0 && SET_ACCELERATION_PRIORITY!=null) { 
     try { SET_ACCELERATION_PRIORITY.invoke(img,new Object[]{new Float(accpty)}); } catch(Throwable thr) {;} 
     } 

    return (img==null ? null : new DctImage(img)); 
    } 
+0

Không làm việc trên màn hình hoặc tắt màn hình (vì vậy đây là nhận xét, không phải là câu trả lời), nhưng bạn biết cách một số ký tự nước ngoài trong chuỗi gây ra chuyển đổi để hiển thị phông chữ TextLayout (không phải là chống răng cưa), phải không? – whybird

Trả lời

7

Tôi thấy có một vài yếu tố đang diễn ra tại đây.

Thứ nhất, hình ảnh cần phải được tạo ra từ các thành phần AWT cơ bản, và nó phải được tạo ra mà không minh bạch:

cfg.createCompatibleImage(wid,hgt); 

thay vì

cfg.createCompatibleImage(wid,hgt,Transparency.TRANSLUCENT); 

Thứ hai, đối với một số lý do không thể giải thích, các cài đặt AA chính, KEY_ANTIALIASING, phải tắt để sử dụng LCD subpixel AA.

Cuối cùng, và quan trọng nhất, phông chữ máy tính để bàn render gợi ý có thể dễ dàng lấy ra sử dụng:

java.awt.Toolkit.getDesktopProperty("awt.font.desktophints") 

Cập nhật 2010-01-05

retesting trong Java 6.26, nó có vẻ như vấn đề với việc cần phải đặt AA chung để hiển thị văn bản AA cuối cùng đã được giải quyết (cách để đi Oracle ... sau khi Sun chỉ là vài năm thập kỷ quá muộn).

5

Sử dụng Swing, tôi có thể nhận được các văn bản đúng anti-aliasing gợi ý như thế này:

JLabel label = new JLabel(); 
FontMetrics fm = label.getFontMetrics(label.getFont()); 
Object aaHintValue = fm.getFontRenderContext().getAntiAliasingHint(); 

Trên hệ thống của tôi này trả RenderingHits.VALUE_TEXT_ANTIALIAS_LCD_HRGB.

+0

Đó là một suy nghĩ thú vị. Tôi không thể sử dụng Swing - không được hỗ trợ trên J2ME/CDC/PP - nhưng tôi có thể có thể thoát ra khỏi cửa sổ AWT. –

+0

Tôi cần kiểm tra điều này tại nơi làm việc ... nhưng vì getFontMetrics() là một phương thức Thành phần, tôi hoàn toàn mong đợi điều này để làm việc trong ngữ cảnh của tôi. Giả sử nó có, bạn có thể mong đợi một sự chấp nhận về điều này trong tháng 1 –

+0

Cho phép +1 này bởi vì nó hoạt động để có được gợi ý AA chính xác; nhưng nó không hoạt động cho AWT (có lẽ vì thành phần gốc không được nhận ra), và thậm chí áp dụng gợi ý LCD được chỉ định không làm subpixel AA, đó là những gì tôi cần cho vấn đề của tôi được giải quyết. –

1

Chờ, bạn có đang chạy mã này trên Windows JVM không? Tôi nghĩ ClearType là một công nghệ của Microsoft mà Swing thừa hưởng thông qua một số mã nguồn gốc (ví dụ, không có sẵn trên Linux hoặc các nền tảng không phải của Microsoft).

Tôi đã từng viết một servlet mà tạo ra JPG với phông chữ chống răng cưa chạy trên Debian, và đây là đoạn code tôi sử dụng

Font font = new Font("Komix", Font.PLAIN, 8); 
Graphics2D g2; 
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
FontRenderContext frc = g2.getFontRenderContext(); 
g2.setFont(font); 
g2.setPaint(Color.black); 
g2.drawString(sMessage, xOffset, yOffset); 

sửa soạn trước tôi không thể nhớ nếu có mã này dựa trên Swing (Tôi đã nhập javax.swing và servlet dài khoảng 300 dòng, vì vậy tôi có thể nghĩ rằng tôi cần nó cho một thứ khác), một kiểm tra nhanh trên Google trông như thế này là bình thường trong không gian AWT. Hy vọng rằng sẽ giúp.

+0

Vâng, tôi có thể bật AA một cách dễ dàng đủ, nhưng nó sử dụng AA tiêu chuẩn trông giống như crap ở bất kỳ kích thước font nào nhỏ hơn khoảng 20 pt; sử dụng GASP AA hoạt động tốt hơn, nhưng có xu hướng chỉ tắt AA cho các kích thước phông chữ nhỏ hơn. Sử dụng subpixel AA là tốt nhất, nhưng bạn phải phù hợp với sắp xếp pixel phần cứng (theo chiều dọc hoặc ngang và RGB hoặc BGR). Tôi muốn kế thừa bất kỳ thiết lập AA nào mà O/S đang sử dụng, vì điều đó sẽ chính xác hoặc ít nhất bằng với những gì người dùng nhìn thấy trên máy tính của họ nói chung. Vấn đề thực sự là AA tiêu chuẩn trông giống như crap bên cạnh subpixel AA. –

+0

BTW, trong khi ClearType là một thương hiệu của Microsoft, công nghệ liên quan là * sub-pixel * anti-aliasing, có sẵn trên tất cả các nền tảng chính. –

2

java.awt.Toolkit.getDesktopProperty ("awt.font.desktophints") có vẻ rỗng trên Linux, ít nhất là không có tùy chọn dòng lệnh vm đặc biệt, có lẽ vì không thể tìm ra nền tảng mặc định là gì. thêm ví dụ "-Dawt.useSystemAAFontSettings = lcd" dường như để chữa nó và cho phép rendering subpixel nếu bạn thiết lập các gợi ý trên dụ Graphics2D của bạn.

+0

Toolkit.getDefaultToolkit(). GetDesktopProperty ("awt.font.desktophints"); – Hanynowsky

Các vấn đề liên quan