【问题标题】:Text to image in javajava中的文本到图像
【发布时间】:2016-05-10 18:38:53
【问题描述】:

我正在尝试将 .txt 文件中的一行文本转换为 java 中的 .jpeg 图像。我写了以下代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.imageio.*;
import java.io.*;
import java.util.*;

public class ProjTry extends JFrame
{
    static BufferedImage img;
    static Graphics g;
    static String s;

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(img,0,0,this);
    }

    /* public*/ ProjTry(String fname) //throws Exception
    {
        BufferedReader br = null;
        try
            {
                br = new BufferedReader(new FileReader(fname));
                //EDIT
                while ((s=br.readLine()) != null)
                    {
                        System.out.println(s);
                    }

            }
        catch (IOException e)
            {
                e.printStackTrace();
            }
        finally
            {
                try
                    {
                        if (br != null)br.close();
                    }
                catch (IOException ex)
                    {
                        ex.printStackTrace();
                    }
            }

    }

    public static void main(String args[])throws Exception
    {
        ProjTry tx=new ProjTry("E:\\Java\\file.txt");
        JFrame j=new JFrame("Demo");
        g=img.getGraphics();
        g.drawString(s,0,0);
        try
            {
                FileOutputStream fos=new FileOutputStream("E:\\Java\\t2img.jpg");
                ImageIO.writeImage(img,"jpg",fos);
                fos.close();
            }
        catch(Exception ex)
            {
                ex.printStackTrace();
            }
    }
}

这里我的文件名为“file.txt”。但是编译器不断显示 2 个错误。我该怎么办?

错误::

第 17 行:找不到符号

     super(.)paintComponent(g);

符号:方法paintComponent(Graphics)

第 79 行:找不到符号

     ImageIO(.)writeImage(img,"jpg",fos);

符号:方法 writeImage(BufferedImage,String,FileOutputStream)

位置:ImageIO 类

【问题讨论】:

  • 请发布堆栈跟踪。
  • 如果这实际上是您的整个班级,那么您最后会缺少}
  • 错别字,大写,.....
  • 好吧,马上就会是JFrame 而不是“Jframe”。
  • 显示所有错误信息。但在这样做之前,请仔细阅读它们,因为它们通常会准确地告诉你哪里出了问题,而且非常清楚。

标签: java image swing text


【解决方案1】:

错误消息准确地告诉您问题所在 - 相信它们并检查它们,您将能够自行解决这些问题和类似问题。

public class ProjTry extends JFrame
{
    static BufferedImage img;
    static Graphics g;
    static String s;

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        g.drawImage(img,0,0,this);
    }

JFrame 类型的paintComponent(Graphics) 方法未定义

JFrame API 将确认这是真的,当您看到此错误和类似错误时,您应该查找 API。看起来您已经复制了 JPanel 的绘画代码并将其放入 JFrame 中,您不应该这样做。在扩展 JPanel 的类内部进行绘制,就像在您借用它的代码中所做的那样,然后将该 JPanel 放入 JFrame 中。

还总是在您的覆盖方法前加上@Override 注释——您认为覆盖父类方法的方法。如果你这样做了:

@Override
public void paintComponent(Graphics g) {
   // etc...

编译器会警告您,您实际上并没有覆盖超级方法。

网站说明:paintComponent 方法应该是protected 而不是public


ImageIO.writeImage(img,"jpg",fos);

ImageIO 类型的 writeImage(BufferedImage, String, FileOutputStream) 方法未定义

ImageIO API 再次确认这是真的,事实上这个类没有 writeImage 方法。请改用 ImageIO.write(...) 方法,*正如 API 将向您展示的那样。或更笼统地说:仅使用 API 规定的可用方法。

例如 -- 没有写入图像文件:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;    
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

@SuppressWarnings("serial")
public class DrawOnImg extends JPanel {
    public static final String IMG_PATH = "https://upload.wikimedia.org/"
            + "wikipedia/commons/thumb/c/c9/Thomas_Hicks_-_Leopold_Grozelier_-_"
            + "Presidential_Candidate_Abraham_Lincoln_1860.jpg/"
            + "456px-Thomas_Hicks_-_Leopold_Grozelier_-_Presidential_Candidate_"
            + "Abraham_Lincoln_1860.jpg";
    public static final String TXT_PATH = "http://history.eserver.org/"
            + "gettysburg-address.txt";
    public static final String NEW_LINE = System.getProperty("line.separator");
    private BufferedImage backgroundImg = null;

    public DrawOnImg(BufferedImage img, String text) {
        backgroundImg = img;

        JTextArea textArea = new JTextArea(text);
        textArea.setOpaque(false);
        setLayout(new GridBagLayout());
        add(textArea);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (backgroundImg != null) {
            g.drawImage(backgroundImg, 0, 0, this);
        }
    }

    @Override
    public Dimension getPreferredSize() {
        if (isPreferredSizeSet() || backgroundImg == null) {
            return super.getPreferredSize();
        }
        int w = backgroundImg.getWidth();
        int h = backgroundImg.getHeight();
        return new Dimension(w, h);
    }

    private static void createAndShowGui(BufferedImage img, String text) {
        DrawOnImg mainPanel = new DrawOnImg(img, text);

        JFrame frame = new JFrame("DrawOnImg");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        Scanner scanner = null;
        try {
            URL txtUrl = new URL(TXT_PATH);
            scanner = new Scanner(txtUrl.openStream());
            final String text = readText(scanner);

            URL imgUrl = new URL(IMG_PATH);
            final BufferedImage img = ImageIO.read(imgUrl);
            SwingUtilities.invokeLater(() -> createAndShowGui(img, text));
        } catch (IOException e) {
            e.printStackTrace();
            System.exit(-1);
        } finally {
            if (scanner != null) {
                scanner.close();
            }
        }

    }

    private static String readText(Scanner scanner) {
        StringBuilder sb = new StringBuilder();
        boolean save = false;
        while (scanner.hasNextLine()) {
            String line = scanner.nextLine().trim();
            if (line.startsWith("Four score")) {
                save = true;
            } 
            if (line.startsWith("-----")) {
                save = false;
            }
            if (save && !line.isEmpty()) {
                sb.append(line);
                sb.append(NEW_LINE);
            }
        }
        return sb.toString();
    }
}

哪些输出:

【讨论】:

  • 我按照您的指示进行了编译,并且可以完美编译。但是,有一个主要问题:我的文本文件中的文本被打印了无数次。你能告诉我问题是什么吗?
  • @Qwerty:这不是您使用 BufferedReader 从文件中读取文本的方式。看看 while 循环——你曾经在循环中读过文本吗? s 会改变吗?它会变成空吗?回答:不,不,不。搜索如何使用 BufferedReader 从文本文件中读取文本并按照找到的示例进行操作。
  • 我这样做了。仍然存在问题。你能告诉我为什么没有输出图像吗?我的意思是我认为我应该在所需位置获得一个名为“t2img”的 jpg 文件
  • 同样在运行时,它在第 58 行给出了一个空指针异常。你能告诉我为什么吗?
猜你喜欢
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 2018-08-23
  • 2012-06-11
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多