Skip to content

Commit 0c003f5

Browse files
brunoborgesCopilot
andcommitted
Supersample OG PNGs: render at 3x then downsample to 1200x630
Renders SVG at 3600×1890 via Batik, then downsamples to 1200×630 using bicubic interpolation for crisp anti-aliased text at the exact OG-recommended dimensions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent f3091f7 commit 0c003f5

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

html-generators/generateog.java

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,27 @@ static void ensureFonts() throws IOException {
132132
}
133133

134134
/** Convert an SVG string to a PNG file using Batik. */
135+
/** Convert SVG to a crisp 1200×630 PNG by rendering at 3× then downsampling with bicubic interpolation. */
135136
static void svgToPng(String svgContent, Path pngPath) throws Exception {
137+
int scale = 3;
138+
// Render at 3× resolution
136139
var input = new TranscoderInput(new java.io.StringReader(svgContent));
137-
try (var out = new java.io.BufferedOutputStream(Files.newOutputStream(pngPath))) {
138-
var transcoder = new PNGTranscoder();
139-
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) W * 2);
140-
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) H * 2);
141-
transcoder.transcode(input, new TranscoderOutput(out));
142-
}
140+
var bos = new java.io.ByteArrayOutputStream();
141+
var transcoder = new PNGTranscoder();
142+
transcoder.addTranscodingHint(PNGTranscoder.KEY_WIDTH, (float) (W * scale));
143+
transcoder.addTranscodingHint(PNGTranscoder.KEY_HEIGHT, (float) (H * scale));
144+
transcoder.transcode(input, new TranscoderOutput(bos));
145+
146+
// Read back and downsample to 1200×630
147+
var hiRes = javax.imageio.ImageIO.read(new java.io.ByteArrayInputStream(bos.toByteArray()));
148+
var target = new java.awt.image.BufferedImage(W, H, java.awt.image.BufferedImage.TYPE_INT_ARGB);
149+
var g = target.createGraphics();
150+
g.setRenderingHint(java.awt.RenderingHints.KEY_INTERPOLATION, java.awt.RenderingHints.VALUE_INTERPOLATION_BICUBIC);
151+
g.setRenderingHint(java.awt.RenderingHints.KEY_RENDERING, java.awt.RenderingHints.VALUE_RENDER_QUALITY);
152+
g.setRenderingHint(java.awt.RenderingHints.KEY_ANTIALIASING, java.awt.RenderingHints.VALUE_ANTIALIAS_ON);
153+
g.drawImage(hiRes, 0, 0, W, H, null);
154+
g.dispose();
155+
javax.imageio.ImageIO.write(target, "png", pngPath.toFile());
143156
}
144157

145158
static SequencedMap<String, String> loadProperties(String file) {

0 commit comments

Comments
 (0)