kopiowanie BufferedImage

0

Cześć, pisałem sobie dzisiaj metodę konwertującą obraz do skali szarości. Zależało mi jednak na tym, aby nie działać na oryginale, ponieważ chcę mieć historię zmian i móc zawsze wrócić do wcześniejszych wersji. Napisałem więc taką funkcję:

public BufferedImage toGreyScale(BufferedImage img)
	{
		BufferedImage pImg = new BufferedImage(img.getColorModel(), img.getRaster(), img.isAlphaPremultiplied(), null);
		
		int color;
		Color rgb;
		int avgValue;
		
		for(int i=0; i<pImg.getWidth(); i++)
		{
			for(int j=0; j<pImg.getHeight(); j++)
			{
				color = pImg.getRGB(i, j);
				rgb = new Color(color);
				avgValue = (rgb.getRed() + rgb.getGreen() + rgb.getBlue())/3;
				rgb = new Color(avgValue, avgValue, avgValue);
				color = rgb.getRGB();
				pImg.setRGB(i, j, color);
			}
		}
		//img = null;
		imgStates.add(pImg);
		visualPanel.refreshImg(pImg);
		return pImg;
	}

Problem w tym, że gdy chcę wrócić do oryginału (kolorowego), wyświetla mi obraz w skali szarości. Funkcja rysująca (visualPanel.refreshImg(pImg)) przyjmuje to co trzeba. Ogólnie program zachowuje się tak, jakbym nie robił kopii tylko użył referencji podanego argumentu. Wypisałem więc listę imgStates i uzyskałem następujące dane:

BufferedImage@1b393a0: (...) color space = java.awt.color.ICC_ColorSpace@34a0ee3f (...)
BufferedImage@31798517: (...) color space = java.awt.color.ICC_ColorSpace@34a0ee3f (...)

Jak widać są to różne obiekty, ale o identycznych, parametrach. Moją uwagę zwrócił parametr 'color space' który przy obu obiektach znajduje się pod tym samym adresem. Nie znam się jednak na tyle, aby stwierdzić czy jest to po prostu odwołanie do tej samej biblioteki (java.awt.color....) czy może tworząc kopię, skopiowałem też adres jakiejś przestrzeni kolorów, z której korzystają te obiekty ?

Byłbym wdzięczny za wyjaśnienie, co jest nie tak i jak zrobić kopię BufferedImage tak aby obiekty były od siebie całkowicie niezależne ?

0

http://stackoverflow.com/questions/3514158/how-do-you-clone-a-bufferedimage

Tutaj sprawdź, może coś z tego zadziała :o.
Szczerze mówiąc dziwi mnie taki efekt.

1

img.getRaster() - drugi obrazek ma pod spodem ten sam raster, następnie zapisujesz na obu obrazkach do wspólnego rastra, dlatego oba wyglądają identycznie.

0

@airborn no właśnie przypuszczałem, że coś takiego się stało. Udało mi się jednak napisać odpowiednio działającą kopię:

BufferedImage pImg = new BufferedImage(img.getColorModel(), img.copyData(null), img.isAlphaPremultiplied(), null);

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