2015-04-28 35 views
-1

我正在用Java创建具有用透明背景写在其上的字体的图像。我使字体不同的颜色和不同类型的字体样式,所以我需要程序是动态的。问题在于我使用Graphics2D并使用g2d.drawString()写入缓冲图像,并且图像几乎不是我正在寻找的定义。我已经尝试创建大字体大小的图像,然后缩小比例,但这也不起作用。我也已将所有可能的渲染提示设置为最高定义。我希望像素密度足够高,以至于如果您将它与视网膜屏幕上的常规文字进行比较,则没有多大区别。谢谢。如何在Java中创建自定义高清图像

+0

据我所知,Retina分辨率是通过缩小图像大约4倍来实现的。因此,您需要决定目标分辨率并将图像缩放4倍,渲染您的输出并将其缩小4倍......我认为...当您说从.createGraphics()获取图形对象isn时,会出现 – MadProgrammer

回答

2

要在Java中拥有“视网膜”质量的图像,您必须在两个维度上创建并渲染您的BufferedImage正常尺寸的2倍(这将使图像大4倍,我认为这是@MadProgrammer的含义) 。

然后,您必须下采样(或“规模”)在Java中的形象,而是保持BufferedImage在全尺寸的,只有一半大小绘制图像的原生支持Graphics2D实例。 Graphics传递给paint()paintComponent()对象的AWT或Swing组件的方法通常是正常的(而不是来自BufferedImage.get/createGraphics()的那个)。

我用这样的代码的成功:

@Override 
public void paintComponent(Graphics g) { 
    Graphics2D g2 = (Graphics2D) g; 
    AffineTransform xform = AffineTransform.getScaleInstance(.5, .5); 
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
         RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    g2.drawImage(image, xform, null); // image being @2x or "retina" size 
} 

但是,请注意,由于现代计算机上的字体渲染使用"sub pixel antialiasing" or "sub pixel rendering",这是特定于您所呈现的屏幕设备(见链接,但基本上,RGB模式或“布局”因设备而异)。这意味着BufferedImage通常不能使用亚像素渲染,因此字体看起来不那么清晰。如果要渲染到单个LCD屏幕,则可以指定RenderingHints.TEXT_ANTIALIAS_LCD_*渲染提示中的一个以获得更好的结果。

+0

isn不错,我如何得到你所描述的“g”变量? – HaydenKai

+0

我最终将此图像导出为PNG并在其他位置使用。 – HaydenKai

+0

@ user3168190正如我所说的,您将'Graphics'传递到Swing(或AWT)应用程序的'paint()'方法中。但是,取决于“别处”的位置,这可能不适用。只需将PNG写入完整@ 2x大小(两个维度都是双倍)即可。然后,适当地控制渲染,即。如果“其他”位于网络上,请使用CSS以一半尺寸进行渲染。 – haraldK

相关问题