imagegen:

Generate RGB QR code images
re-enable font anti-aliasing
scale font based on text and image size
This commit is contained in:
zzz
2019-07-11 14:04:12 +00:00
parent 3e48bf80f1
commit 6b990689cc

View File

@@ -64,7 +64,6 @@ public class QRServlet extends HttpServlet {
private static final String IDENTICON_IMAGE_FORMAT = "PNG";
private static final String IDENTICON_IMAGE_MIMETYPE = "image/png";
private static final long DEFAULT_IDENTICON_EXPIRES_IN_MILLIS = 24 * 60 * 60 * 1000;
// TODO the fonts all look terrible. See also the rendering hints below, nothing helps
private static final String DEFAULT_FONT_NAME = SystemVersion.isWindows() ?
"Lucida Sans Typewriter" : Font.SANS_SERIF;
private static final Font DEFAULT_LARGE_FONT = new Font(DEFAULT_FONT_NAME, Font.BOLD, 16);
@@ -148,19 +147,25 @@ public class QRServlet extends HttpServlet {
}
String text = request.getParameter(PARAM_IDENTICON_TEXT_SHORT);
if (text != null) {
BufferedImage bi = MatrixToImageWriter.toBufferedImage(matrix);
// add 1 so it generates RGB instead of 1 bit,
// so text anti-aliasing works
MatrixToImageConfig cfg = new MatrixToImageConfig(MatrixToImageConfig.BLACK + 1,
MatrixToImageConfig.WHITE);
BufferedImage bi = MatrixToImageWriter.toBufferedImage(matrix, cfg);
Graphics2D g = bi.createGraphics();
// anti-aliasing and hinting degrade text with 1bit input, so let's turn this off to improve quality
// g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
// g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
// g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
// g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
Font font = DEFAULT_LARGE_FONT;
// anti-aliasing and hinting for the text
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
g.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
g.setRenderingHint(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
// scale font
float shrink = Math.min(1.0f, 14.0f / text.length());
int pts = Math.round(shrink * 16.0f * size / 160);
Font font = new Font(DEFAULT_FONT_NAME, Font.BOLD, pts);
g.setFont(font);
// doesn't work
Color color = Color.RED;
Color color = Color.BLACK;
g.setColor(color);
int width = bi.getWidth();
int height = bi.getHeight();