How do I copy an array?

147 views Asked by At

What I'm trying to do is I'm trying to take an image and make it a tiled image. The starting image should look like this. http://i1146.photobucket.com/albums/o525/walroid/letter_Q_grayscale_zpsd3b567a7.jpg And then what the image is turned into tiles then it should look like this: http://i1146.photobucket.com/albums/o525/walroid/replicate_example_zps5e5248e8.jpg In my code the pictures are saved into an array which is called into the method. What I want to do is copy that array and then put it into another array which will replicate the image. How do I do that? Here's my entire code:

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;

public class ImageProcessor {
    public static void main(String[] args) {


        if (args.length < 3) {
            System.out.println("Not enough arguments");
            System.exit(-1);
        }
        String function = args[0];
        if (function.equals("-reflectV")) {
            String inputFileName = args[1];
            String outputFileName = args[2];

            int[][] imageArr = readGrayscaleImage(inputFileName);
            int[][] reflectedArr = reflectV(imageArr);

            writeGrayscaleImage(outputFileName, reflectedArr);
        } else if (function.equals("-reflectH")) {
            String inputFileName = args[1];
            String outputFileName = args[2];

            int[][] imageArr = readGrayscaleImage(inputFileName);
            int[][] reflectedArr = reflectH(imageArr);

            writeGrayscaleImage(outputFileName, reflectedArr);
        } else if (function.equals("-ascii")) {
            String inputFileName = args[1];
            String outputFileName = args[2];

            int[][] imageArr = readGrayscaleImage(inputFileName);
            int[][] reflectedArr = reflectV(imageArr);
            try {
                PrintStream output = new PrintStream(new File("output.txt"));
            } catch (java.io.FileNotFoundException ex) {
                System.out.println("Error: File Not Found");
                System.exit(-1);
            }
        } else if (function.equals("-adjustBrightness")) {
            String amount = args[1];
            int a = Integer.parseInt(amount);
            System.out.print(a)

            String inputFileName = args[1];
            String outputFileName = args[2];

            int[][] imageArr = readGrayscaleImage(inputFileName);
            int[][] brightnessArr = adjustBrightness(imageArr);

            writeGrayscaleImage(outputFileName, brightnessArr);

        } else
            System.out.println("That is not a valid choice");
        system.exit(-1)


        public static int[][] reflectV ( int[][] arr){
            int[][] reflected = new int[arr.length][arr[0].length];
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    reflected[i][j] = arr[i][arr[i].length - 1 - j];
                }
            }

            return reflected;
        }

        public static int[][] reflectH ( int[][] arr){
            int[][] reflected = new int[arr.length][arr[0].length];
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    reflected[j][i] = arr[i][arr[j].length - 1 - j];
                }
            }

            return reflected;
        }

        public static int[][] adjustBrightness ( int[][] arr){
            int[][] brightness = new int[arr.length][arr[0].length];
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[i].length; j++) {
                    RGB
                }
            }

            return brightness;
        }

        public static int[][] readGrayscaleImage (String filename){
            int[][] result = null; //create the array
            try {
                File imageFile = new File(filename);    //create the file
                BufferedImage image = ImageIO.read(imageFile);
                int height = image.getHeight();
                int width = image.getWidth();
                result = new int[height][width];        //read each pixel value
                for (int x = 0; x < width; x++) {
                    for (int y = 0; y < height; y++) {
                        int rgb = image.getRGB(x, y);
                        result[y][x] = rgb & 0xff;
                    }
                }
            } catch (IOException ioe) {
                System.err.println("Problems reading file named " + filename);
                System.exit(-1);
            }
            return result;
        }


    public static void writeGrayscaleImage(String filename, int[][] array) {
        int width = array[0].length;
        int height = array.length;

        try {
            BufferedImage image = new BufferedImage(width, height,
                    BufferedImage.TYPE_INT_RGB);    //create the image

            //set all its pixel values based on values in the input array
            for (int x = 0; x < width; x++) {
                for (int y = 0; y < height; y++) {
                    int rgb = array[y][x];
                    rgb |= rgb << 8;
                    rgb |= rgb << 16;
                    image.setRGB(x, y, rgb);
                }
            }

            //write the image to a file
            File imageFile = new File(filename);
            ImageIO.write(image, "jpg", imageFile);
        } catch (IOException ioe) {
            System.err.println("Problems writing file named " + filename);
            System.exit(-1);
        }
    }
}
3

There are 3 answers

0
Orobo Lucky Ozoka On

Using the Array class and calling the static method Array.copyOf(array, array.length) is quite handy so that if myArray1 is the previous array and myArray2 is the new array then myArray2 = Array.copyOf(myArray1, myArray1.length)

5
SnakeDoc On

You need to do a "deep copy" of the array. Simply copying your array to a new variable will only assign the reference (shallow copy), and if you manipulate data in one of the arrays, it will change both.

Shallow Copy:

String[] myArray2 = myArray1;

This will essentially have 2 references pointing at the same data. If you change anything in myArray2, it will also change in myArray1.

Deep Copy:

There are multiple ways to do a deep copy. The obvious way is to iterate over your array and copy each element one at a time into the new array.

String[] myArray2 = new String[myArray1.length];
for (int i = 0; i < myArray1.length; i++) {

    myArray2[i] = myArray1[i];

}

A sometimes simpler/faster way is to serialize your array and then de-serialize it while it's still in memory. This causes the JVM to treat the de-serialized array as an entirely new array ("no strings attached" so-to-speak).

Here's an example from an old project of mine:

/**
 * Clones an object creating a brand new
 * object by value of input object. Accomplishes this
 * by serializing the object, then deservializing it.
 * 
 * @param obj Input Object to clone
 * @return a new List<Product> type cloned from original.
 * @throws IOException If IOException
 * @throws ClassNotFoundException If ClassNotFoundException
 */
private static List<Product> cloneProdList(Object obj) throws IOException, ClassNotFoundException {

    java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream();
    java.io.ObjectOutputStream obj_out = new java.io.ObjectOutputStream(bos);
    obj_out.writeObject(obj);

    java.io.ByteArrayInputStream bis = new java.io.ByteArrayInputStream(bos.toByteArray());
    java.io.ObjectInputStream obj_in = new java.io.ObjectInputStream(bis);

    @SuppressWarnings("unchecked")
    List<Product> newObj = (List<Product>)obj_in.readObject();

    bos.close();
    bis.close();
    obj_out.close();
    obj_in.close();

    return newObj;
}

This code takes a List type as the input (well, it actually casts to an Object type), serializes and then de-serializes while still in memory, then casts back into a List object and returns the new object back out of the method.

You can modify it to use an Array object instead pretty easily. (an array[] type will autobox into Array for you)

0
Ensar Hatipoglu On