package org.ea.javacnn.readers;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class ImageReader implements Reader {
    private int imageSizeX = -1;
    private int imageSizeY = -1;
    private int maxvalue = -1;
    private List labels;
    private String imagePath;
    private List filenames = new ArrayList<>();
    private boolean readLabel = false;
    private boolean readImage = false;
    private int currentImage = 0;

    public ImageReader(String imagePath) {
        this.imagePath = imagePath;
        File dir = new File(imagePath);
        Set labels = new HashSet<>();
        for(File f : dir.listFiles()) {
            if(!f.isFile()) continue;
            filenames.add(f.getName());
            labels.add(f.getName().split("_")[0]);
        }

        this.labels = new ArrayList<>();
        this.labels.addAll(labels);

        try {
            String filename = filenames.get(0);
            BufferedImage bi = ImageIO.read(new File(imagePath, filename));
            this.imageSizeX = bi.getWidth();
            this.imageSizeY = bi.getHeight();
            this.maxvalue = 255;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void incrementCounter() {
        currentImage++;
        readLabel = false;
        readImage = false;
    }

    /**
    * Get labels  
    **/
    public List getLabels() {
        return labels;
    }


    @Override
    public int readNextLabel() {
        if(readLabel) {
            incrementCounter();
        }
        String filename = filenames.get(currentImage);
        int label = labels.indexOf(filename.split("_")[0]);
        if(readImage) {
            incrementCounter();
        } else {
            readLabel = true;
        }
        return label;
    }

    @Override
    public int[] readNextImage() throws Exception {
        if(readImage) {
            incrementCounter();
        }
        if(currentImage >= this.size()) return new int[0];

        String filename = filenames.get(currentImage);
        try {
            BufferedImage orgImg = ImageIO.read(new File(imagePath, filename));
            BufferedImage newImg = new BufferedImage(imageSizeX, imageSizeY, BufferedImage.TYPE_BYTE_GRAY);
            Graphics g = newImg.getGraphics();
            g.drawImage(orgImg, 0, 0, null);

            int[] imageData = new int[imageSizeX * imageSizeY];
            imageData = newImg.getData().getPixels(0, 0, imageSizeX, imageSizeY, imageData);
            if(readLabel) {
                incrementCounter();
            } else {
                readImage = true;
            }
            return imageData;
        } catch (Exception e) {
            throw e;
        }
    }

    @Override
    public void reset() {
        currentImage = 0;
        readLabel = false;
        readImage = false;
    }

    public int numOfClasses() {
        return labels.size();
    }

    @Override
    public int size() {
        return filenames.size();
    }

    @Override
    public int getSizeX() {
        return imageSizeX;
    }

    @Override
    public int getSizeY() {
        return imageSizeY;
    }

    @Override
    public int getMaxvalue() {
        return maxvalue;
    }

    public static void main(String[] argv) {
        Reader mr = new ImageReader("pngfiles/train");
        System.out.println(mr.size());
        for(int i=0; i 

Ads help maintain this website.