在安卓上将文本转换为图像文件

7
我有一个文本文件(.txt),我想将其转换为图像(.png或.jpg)。例如,黑色文字在白色背景上。我如何使用编程方式实现?
3个回答

13

我认为多行文本的正确方式是这样的:

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,所以... :) - M-Wajeeh
是的,将评论留作警告,提醒像我这样通过非安卓搜索进入此处的人们 :) - Tim B
当一行包含许多字符时,文本的大小非常小。 - Anuj
经过一个小时的搜索,找到了最佳答案!有人推荐了xmlgraphics-commons https://mvnrepository.com/artifact/org.apache.xmlgraphics/xmlgraphics-commons/2.9。纯Java编写,但值得探索。 - Gleichmut

7
这段(未经测试的)代码应该能够帮助你朝正确的方向前进。
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"来换行。 - Seshu Vinay
Canvas.drawText() 不支持处理换行。不过,有一个(丑陋的)解决方法。请参阅此帖子获取详细信息。 - Renard

0

这就是你需要的:

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

如果您需要,我可以提供示例代码。

编辑:简单示例: package 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);
            }
        }
       }
    }

是的,我想要一个样例,你能提供吗? - NareshRavva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接