BufferedImage undo-redo na tablicy

0

Cześć, chcę w moim Paintcie zrobić cofnij-przywróć zmiany na podstawie BufferedImage i trójwymiarowej tablicy.
Stworzyłem więc funkcję testową:

private void addChange(BufferedImage img) {
		BufferedImage[] array = new BufferedImage[3];

		if (array[0] == null) { // pierwsza zmiana na obrazie
			array[0] = img;
		} else if (array[1] == null) { // druga
			array[1] = img;
		} else if (array[2] == null) { // trzecia
			array[2] = img;
		} else if (array[0] != null && array[1] != null && array[2] != null) { // kolejne
			array[0] = array[1]; // zapominam o pierwszej zmianie i przypisuje
									// na jej miejsce drugą
			array[1] = array[2]; // 3 -> 2
			array[2] = img; // zmiana n -> 3
			try {
				ImageIO.write(array[0], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array1.png"));

				ImageIO.write(array[1], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array2.png"));

				ImageIO.write(array[2], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array3.png"));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

Jednak BufferedImage'y zapisane z tablic dają takie same wyniki, tzn. każda jest taka sama, równa ostatniej zmianie na obrazie.
Nie mogę znaleźć żadnego błędu, kolejność przypisywania zmian chyba jest dobra.

Pozdrawiam

0
private void addChange(BufferedImage img) {
                BufferedImage[] array = new BufferedImage[3];

Za każdym razem tworzysz nową tablicę array, zatem wszystkie jej elementy są równe null i warunek array[0] == null jest zawsze spełniony. Tablicę należy tworzyć tylko raz.

0

Ok, wyrzuciłem przed metodę, do tego dodałem nowe warunki i printy do debugowania:

void addChange(BufferedImage img) {
		if (array[0] == null) { // pierwsza zmiana na obrazie
			array[0] = img;
			System.out.println("array 1 " + img.getRGB(1, 1));
		} else if (array[1] == null && array[0] != null) { // druga
			array[1] = img;
			System.out.println("array 2 " + img.getRGB(1, 1));
		} else if (array[2] == null && array[0] != null && array[1] != null) { // trzecia
			array[2] = img;
			System.out.println("array 3 " + img.getRGB(1, 1));
		} else if (array[0] != null && array[1] != null && array[2] != null) { // kolejne
			array[0] = array[1]; // zapominam o pierwszej zmianie i przypisuje
									// na jej miejsce drugą
			array[1] = array[2]; // 3 -> 2
			System.out.println("array 1 - " + array[0].getRGB(1, 1));
			System.out.println("array 2 - " + array[1].getRGB(1, 1));
			System.out.println("array 3 - " + array[2].getRGB(1, 1));
			System.out.println("new" + img.getRGB(1, 1));
			array[2] = img; // zmiana n -> 3
			try {
				ImageIO.write(array[0], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array1.png"));

				ImageIO.write(array[1], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array2.png"));

				ImageIO.write(array[2], "png", new File(
						"C:\\Users\\Adrian\\Desktop\\array3.png"));
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

Otrzymuję taki wynik:

array 1 -65536
array 2 1727987712
array 3 0
array 1 - -16777216
array 2 - -16777216
array 3 - -16777216
new-16777216

Za każdym razem zmieniam kolor pierwszego punktu (1,1). Nadal nie widzę co robię nie tak.

0

Pytanie co przekazujesz do funkcji addChange. Czy za każdym razem do tworzenia obrazu (zmienna img) używasz operatora new? Jeżeli nie, to za każdym razem przekazywana jest do funkcji addChange ta sama referencja.

0

Mam klasę, którą mogę rysować (free-hand brushe i tak dalej) na JPanelu, tworzę z jej poziomu nowy obiekt i mam jeden BufferedImage:

Redrawable redraw = new Redrawable();
BufferedImage ss = ...

a następnie

mouseReleased(MouseEvent e){
redraw.addChange(ss); //zmieniona grafika jest wysyłana do addChange, który powinien zapisać w jednej z trzech tablic
}

Teraz powinienem zrobić przycisk, który kasuje ostatnią zmianę i przywraca poprzedni obraz, jednak zatrzymuję się na tej funkcji zapisywania BufferedImage do tablicy.

0

Zapomniałem: rysuję poprzez

Graphics2D gz = ss.createGraphics();
0

To jest na pewno źle, przed każdym wysłaniem musisz na nowo utworzyć obiekt BufferedImage. Ty wysyłasz zawsze tę sama referencję, ona opisuje za każdym razem inny obrazek, ale referencja jest ta sama. W konsekwencji w tablicy masz jedną, dwie lub trzy referencje do ostatnio zapamiętanego obrazka.

1 użytkowników online, w tym zalogowanych: 0, gości: 1