Как нарисовать графический интерфейс с помощью двоичной обработки изображений? - PullRequest
0 голосов
/ 01 декабря 2018

Я работаю над обработкой изображений, но я не могу найти способ рисовать GUI RGB с помощью чтения двоичных изображений.Я застрял в области paintComponent.

Я могу прочитать файл, но не могу нарисовать значения RGB в GUI.Может кто-нибудь направить меня, пожалуйста?

Это то, что я сделал до сих пор:

private int ws;
private FileInputStream fis;

mybin(){
    try {
        fis = new FileInputStream("mybin.bin");

        String mn = getMagicNumber();
        System.out.println(mn);

        skipWhitespace();

        int width = readNumber();
        System.out.println(width);

        skipWhitespace();

        int height = readNumber();
        System.out.println(height);

        skipWhitespace();
        int maxNum = readNumber();

        System.out.println(maxNum);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    catch(IOException e2) {}
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.setSize(600,600);
    this.setVisible(true);
}
private String getMagicNumber() {
    byte [] magicNum = new byte[2];
    try {
        fis.read(magicNum);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return new String(magicNum);
}
private void skipWhitespace() {
    try {
        ws = fis.read();
        while(Character.isWhitespace(ws))
            ws = fis.read();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
private int readNumber() {
    String wstr = "";
    try {
        while(!Character.isWhitespace(ws)) {
            //while(Character.isDigit(ws))
                wstr = wstr + (ws-'0'/*48*/);
                ws = fis.read();
            }
    }catch(IOException e2) {}

    System.out.println(wstr);
    return Integer.parseInt(wstr);
}

class DrawingPanel extends JPanel{
    @Override
    public void paintComponent(Graphics g) {

    }
}
public static void main(String [] args) {
    new mybin();
}
}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Если у вас есть структура данных для хранения значений RGB и вы хотите нарисовать их на экране:

Сначала вы должны создать image из них, в первую очередь.Примерно так:

// Create an image, with given dimensions, and RGB palette...
final BufferedImage image = new BufferedImage( width, height, BufferedImage.TYPE_INT_RGB);
// Paint the RGB values (EG from arrays) to the image
for (int x = 0; x < width; ++x)
  for (int y = 0; y < height; ++y)
  {
    // Convert the R,G,B values to a single int
    final int rgb = r[x,y]*0x10000 + g[x,y]*1x100 + b[x,y];
    // Color the pixel...
    image.setRGB(x, y, rgb);
  }

Затем отобразите его в графическом интерфейсе.
Это можно сделать, создав специальный компонент и выполнив рисование, см. Ответ c0der.

Или вы можете просто создать Icon и добавить его к любому JLabel:

label.setIcon(new ImageIcon(image));
0 голосов
/ 01 декабря 2018

Рисовать BufferedImage можно так же просто, как:

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class ImageFrame extends javax.swing.JFrame {

    public ImageFrame() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        add(new GraphicsPanel());
        pack();
        setVisible(true);
    }

    public static void main(final String[] args){
        new ImageFrame();
    }
}

class GraphicsPanel extends JPanel {

    private  BufferedImage image;
    //always use publicly accessible resources when posting mcve
    private final  String imagePath = "https://upload.wikimedia.org/wikipedia/commons/3/3f/Crystal_Project_bug.png";

    GraphicsPanel(){
          try {
              image = ImageIO.read(new URL(imagePath)); //or  image = ImageIO.read(new File(...));
          } catch(final IOException e) {e.printStackTrace(); }
        setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
    }
    @Override
    protected void paintComponent(final Graphics g) {
        super.paintComponent(g);
        g.drawImage(image, 0, 0, null);
    }
}
...