图像上的Java文本

2019年1月19日 10点热度 0条评论

我正在将图像加载到bufferedimage中,然后在上面写一些文本。添加文本后,图像变得模糊并且文本失真。我的文字为ANTIALIASING。可以看作是附件。

解决方案如下:

您应该能够使用其他响应中显示的呈现提示来控制文本质量。我知道它起作用是因为我做了很多事情,因此我认为在这种情况下,一定是其他原因导致质量下降。

  • 您如何检查图像质量?您是将生成的BufferedImage直接绘制到Java应用程序的屏幕图形中还是保存到磁盘(即JPEG)中?如果将其保存到磁盘,请尝试将其另存为PNG 24而不是JPEG。我假设您的桌面屏幕以真彩色(32或24位色深)运行,对吗?
  • 您确定该图像实际上是作为BufferedImage.TYPE_INT_RGB创建的吗?如果您无法控制代码中BufferedImage的创建,请尝试使用TYPE_INT_RGB创建一个新的BufferedImage并将其绘制为源,然后将文本绘制到其中。
  • 尝试将RenderingHints.KEY_DITHERING设置为RenderingHints.VALUE_DITHER_DISABLE(尽管对于真彩色图像来说不需要)。
  • 如果这仍然不能帮助您找到原因,请提供更多信息(VM版本,操作系统)和源代码。使用JDK 1.6 Update 10时,文本渲染变得非常好,但是较早的版本也能够在图像中生成纯净的文本,只是由于不太复杂的抗锯齿效果而看起来不那么好。

    ,回复您的评论:

    文本中的高对比度尖锐边缘称为
    general problem with JPEG compression,因为它不是无损压缩。如果确实需要使用JPEG并且无法切换到PNG,则可以调整已保存图像的压缩质量,以在图像质量和文件大小之间找到更好的折衷方案。有关保存JPEG时如何设置压缩质量的信息,请参见以下代码。

    import javax.imageio.IIOImage;
    import javax.imageio.ImageIO;
    import javax.imageio.ImageWriteParam;
    import javax.imageio.ImageWriter;
    import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
    import javax.imageio.stream.ImageOutputStream;
    
    //----
    
    float quality = 0.85f;
    File outfile = new File( "MyImage.jpg" );
    BufferedImage image = ...;
    
    ImageWriter imgWriter = ImageIO.getImageWritersByFormatName( "jpg" ).next();
    ImageOutputStream ioStream = ImageIO.createImageOutputStream( outfile );
    imgWriter.setOutput( ioStream );
    
    JPEGImageWriteParam jpegParams = new JPEGImageWriteParam( Locale.getDefault() );
    jpegParams.setCompressionMode( ImageWriteParam.MODE_EXPLICIT );
    jpegParams.setCompressionQuality( quality );
    
    imgWriter.write( null, new IIOImage( image, null, null ), jpegParams );
    
    ioStream.flush();
    ioStream.close();
    imgWriter.dispose();