【问题标题】:Convert text to image file on Android在 Android 上将文本转换为图像文件
【发布时间】:2012-04-15 21:55:53
【问题描述】:

我有一个文本文档 (.txt)。我想将其转换为图像(.png 或 .jpg)。例如,白色背景上的黑色文本。我怎样才能以编程方式做到这一点?

【问题讨论】:

    标签: java android file-format


    【解决方案1】:

    我认为多行文本的正确方法是:

    String text = "This \nis \nmultiline";
    
    final Rect bounds = new Rect();
    TextPaint textPaint = new TextPaint() {
        {
            setColor(Color.WHITE);
            setTextAlign(Paint.Align.LEFT);
            setTextSize(20f);
            setAntiAlias(true);
        }
    };
    textPaint.getTextBounds(text, 0, text.length(), bounds);
    StaticLayout mTextLayout = new StaticLayout(text, textPaint,
                bounds.width(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
    int maxWidth = -1;
    for (int i = 0; i < mTextLayout.getLineCount(); i++) {
        if (maxWidth < mTextLayout.getLineWidth(i)) {
            maxWidth = (int) mTextLayout.getLineWidth(i);
        }
    }
    final Bitmap bmp = Bitmap.createBitmap(maxWidth , mTextLayout.getHeight(),
                Bitmap.Config.ARGB_8888);
    bmp.eraseColor(Color.BLACK);// just adding black background
    final Canvas canvas = new Canvas(bmp);
    mTextLayout.draw(canvas);
    FileOutputStream stream = new FileOutputStream(...); //create your FileOutputStream here
    bmp.compress(CompressFormat.PNG, 85, stream);
    bmp.recycle();
    stream.close();
    

    【讨论】:

    • 问题被标记为 Android 所以... :)
    • 是的,留下评论作为对像我这样谷歌在非安卓搜索中带来的人的警告:)
    • 当一行包含很多字符时,文本的大小非常小。
    【解决方案2】:

    这是你需要的:

    http://mvnrepository.com/artifact/org.apache.xmlgraphics/xmlgraphics-commons/1.3.1

    如果你愿意,我可以为你提供示例代码。

    编辑:简单示例: 包 v13;

    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
    import java.io.FileOutputStream;
    import java.io.OutputStream;
    
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    import org.apache.xmlgraphics.image.codec.png.PNGImageEncoder;
    
    public class Deneme {
        public static void main(String[]args){
            JFrame jf = new JFrame();
            jf.setVisible(true);
    
            JPanel jp = new JPanel();
            jf.add(jp); 
            JLabel jl = new JLabel("trial text");
            jf.add(jl);
            jf.setSize(300, 200);
    
            JFileChooser jfc = new JFileChooser();
            int temp = jfc.showSaveDialog(jfc);
            if (temp == JFileChooser.APPROVE_OPTION) {
                System.out.println(jfc.getSelectedFile());
                Component myComponent = jf;
                Dimension size = myComponent.getSize();
                BufferedImage myImage = new BufferedImage(size.width,
                        size.height, BufferedImage.TYPE_INT_RGB);
                Graphics2D g2 = myImage.createGraphics();
                myComponent.paint(g2);
                try {
                    OutputStream out = new FileOutputStream(jfc
                            .getSelectedFile().getAbsolutePath()
                            + ".png");
                    PNGImageEncoder encoder = new PNGImageEncoder(out, null);
                    encoder.encode(myImage);
                    out.close();
                } catch (Exception e) {
                    System.out.println(e);
                }
            }
           }
        }
    

    【讨论】:

    • 你我想要样品你能提供吗
    【解决方案3】:

    这个(未经测试的)代码应该能让你走上正轨。

    void foo(final String text) throws IOException{
        final Paint textPaint = new Paint() {
            {
                setColor(Color.WHITE);
                setTextAlign(Paint.Align.LEFT);
                setTextSize(20f);
                setAntiAlias(true);
            }
        };
        final Rect bounds = new Rect();
        textPaint.getTextBounds(text, 0, text.length(), bounds);
    
        final Bitmap bmp = Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.RGB_565); //use ARGB_8888 for better quality
        final Canvas canvas = new Canvas(bmp);
        canvas.drawText(text, 0, 20f, textPaint);
        FileOutputStream stream = new FileOutputStream(...); //create your FileOutputStream here
        bmp.compress(CompressFormat.PNG, 85, stream);
        bmp.recycle();
        stream.close();
    }
    

    【讨论】:

    • 问题是我无法在文本中给出“\n”以使其出现在下一行
    • Canvas.drawText() 不处理换行符。不过有一个(丑陋的)解决方法。有关详细信息,请参阅此post
    猜你喜欢
    • 2011-09-02
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2012-04-24
    • 2012-09-01
    相关资源
    最近更新 更多