2012-01-23 13 views
1

I am using JLabel文字列から画像ファイルを作成する。JLabelで作成した画像の「ネイティブサイズ」を取得する

Iは、そうでなければ、私は例外を取得し、画像の大きさ(label.setSize(width, height))を指定する必要があります

java.lang.IllegalArgumentException: Width (0) and height (0) cannot be <= 0 
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016) 
    at java.awt.image.BufferedImage.<init>(BufferedImage.java:338) 
    at com.shopsnips.portal.services.ImageCreator.createFromText(ImageCreator.java:31) 
    at com.shopsnips.portal.services.ImageCreator.main(ImageCreator.java:18) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 

私はそのフォント又はテキストを使用する場合、私は

label.setFont(new Font("Serif", Font.BOLD, 26)); 

を使用してフォントサイズを制御することができます。固定ディメンションに収まるには大きすぎますが、ラベルは切り捨てられ、代わりに「...」が含まれます。設定した寸法に適合する最適/最大フォントサイズを特定する方法はありますか?

また、現在の設定(フォントサイズ+寸法)によってテキストが切り捨てられるかどうかを確認するにはどうすればよいですか?ここで

は、いくつかのソースです:

import javax.imageio.ImageIO; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.nio.file.Path; 
import java.nio.file.Paths; 

public class ImageCreator { 
    private ImageCreator(){} 

    private final static String FONT = "Freestyle Script"; 

    public static void main(String[] args) { 
     Path outputFile = Paths.get("c:\\tmp\\img\\test.png"); 

     createFromText("Hello World - this is a long text", outputFile, 150, 50); 
    } 

    /** 
* <p>Create an image from text. <p/> 
* <p/> 
* https://stackoverflow.com/a/4437998/11236 
*/ 
    public static void createFromText(String text, Path outputFile, int width, int height) { 
     JLabel label = new JLabel(text, SwingConstants.CENTER); 
     label.setSize(width, height); 
     label.setFont(new Font(FONT, Font.BOLD, 24)); 

     BufferedImage image = new BufferedImage(
       label.getWidth(), label.getHeight(), 
       BufferedImage.TYPE_INT_ARGB); 

     Graphics g = null; 
     try { 
      // paint the html to an image 
      g = image.getGraphics(); 
      g.setColor(Color.BLACK); 
      label.paint(g); 
     } finally { 
      if (g != null) { 
       g.dispose(); 
      } 
     } 

     // get the byte array of the image (as jpeg) 
     try { 
      ImageIO.write(image, "png", outputFile.toFile()); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

コメントするにはログインしてください。

答えて

2

1)JLabelIconとしてBuferedImageを入れ、

2)setSizeが存在する場合@Jeffreyによって答えが正解、BuferedImageに近づきすぎた)LayoutManager

3のためにこの仕事をさせてください早いほど良いの助けのために両方の寸法

4)を返すことができるI /私たちはあなたのモニター上のコードを見ることができないので、SSCCEを投稿し、またJavaクラス

から生成された例外ください
+0

私は私がリンクされ、ポストを使用しています:

代わりに、私はフォントサイズを選択するには、このヒューリスティックを使用していました。自分のコードを投稿することができます。それは非常に非常に近いです。次元の設定を省略してください。 – ripper234

+0

あなたのSSCCEはここにあります。明日の仕事であなたの答えを試してみます。 https://gist.github.com/1665287 – ripper234

+0

1)「SSCCE」か「SSCCEではない」のどちらかで、「閉じる」という賞はありません。 2)人々は通常、ギブスのような外部サイトへのリンクをたどることはありません。ソースを編集の質問に埋め込む方がよい。私はそれをしました。 –

2

label.setFont(new Font("Serif", Font.BOLD, 26)); ..私が設定した寸法に適合する最適な/最大のフォントサイズを特定する方法はありますか?

テキストのサイズを取得するには、FontMetricsまたはGlyphVectorを参照してください。

テキストのサイズを取得するための「迅速で汚い」方法は、ラベルにドロップすることです&好ましいサイズのラベルを調べます。

これらの図を見ると、それに応じてフォントサイズを調整することができます。

+0

私はFontMetrics +1を忘れてしまった – mKorbel

0

私は答えが嫌いです(または、私が今利用するのに十分詳細ではありません)。それはかなりSSCCEだ...

private static int chooseFontSize(String text) { 
    int largeFont = 28; 
    int mediumFont = 22; 
    int tinyFont = 16; 
    if (text.length() > 25) { 
     return tinyFont; 
    } 
    if (text.length() > 15) { 
     return mediumFont; 
    } 
    return largeFont; 
} 
関連する問題