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));
}
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