2013-05-13 2 views
0

Я пытаюсь сделать изображение из динамического макета html. Как настроить динамическую ширину и высоту изображения в зависимости от высоты и ширины таблицы внутри html. Я имею в виду, как я могу найти таблицу width(x) и height(y) от html?Render изображение динамически

JLabel label = new JLabel(html); 
    label.setSize(x, y); 
    BufferedImage image = new BufferedImage(label.getWidth(),label.getHeight(),BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = (Graphics2D)image.getGraphics(); 
    g2d.setColor(Color.WHITE); 
    g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    label.paint(g2d); 
    g2d.dispose(); 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    try { 
     ImageIO.write(image, "png", baos); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

Ниже приводится схема html.

<html> 
<head>....</head> 
<body topmargin="0" leftmargin="0"><table border=0 cellpadding=0 cellspacing=0 width=700 style='border-collapse:collapse;table-layout:fixed;width:684pt'> 
...... 
...... 
</body></html> 
+1

Вы, вероятно, нужно использовать предпочтительный размер этикетки. Теперь проблема заключается в том, что вы вынуждаете размер метки '(x, y)'. Опубликуйте [SSCCE] (http://sscce.org) для лучшей помощи раньше –

ответ

3

Следующий код работает. Идея состоит в том, что если вы не поместите рендеринг JLabel внутри контейнера с LayoutManager, вам нужно будет установить размер JLabel самостоятельно. Соответствующий размер можно легко найти с помощью getPreferredSize(). Это должно быть сделано исключительно в этой ситуации. Во всех остальных случаях вы не должны называть setSize() самостоятельно, и вы должны оставить все это на LayoutManager.

Результат изображения:

enter image description here

import java.awt.Color; 
import java.awt.Desktop; 
import java.awt.Graphics2D; 
import java.awt.RenderingHints; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import javax.imageio.ImageIO; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

class TestPaint { 

    protected void initUI() { 
     StringBuilder sb = new StringBuilder("<html>"); 
     sb.append("<table>"); 
     for (int i = 0; i < 5; i++) { 
      sb.append("<tr>"); 
      for (int j = 0; j < 5; j++) { 
       sb.append("<td>"); 
       sb.append("Cell ").append(i + 1).append(' ').append(j + 1); 
       sb.append("</td>"); 
      } 
      sb.append("</tr>"); 
     } 
     sb.append("</table>"); 
     JLabel label = new JLabel(sb.toString()); 
     label.setSize(label.getPreferredSize()); 
     BufferedImage image = new BufferedImage(label.getWidth(), label.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = (Graphics2D) image.getGraphics(); 
     g2d.setColor(Color.WHITE); 
     g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     label.paint(g2d); 
     g2d.dispose(); 
     File file = new File("/tmp/test.png"); 
     if (!file.getParentFile().exists()) { 
      file.getParentFile().mkdirs(); 
     } 
     FileOutputStream baos = null; 
     try { 
      baos = new FileOutputStream(file); 
      ImageIO.write(image, "png", baos); 


     Desktop.getDesktop().open(file); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 
      if (baos != null) { 
       try { 
        baos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestPaint().initUI(); 
      } 

     }); 
    } 
} 
+0

Это именно то, что я хотел, спасибо :) –

+0

Один вопрос, хотя, я вижу, что все границы ячейки таблицы исчезают на изображении, любая идея? –

Смежные вопросы