kopiowanie BufferedImage

kopiowanie BufferedImage
Qbisiek
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 lat
  • Postów:160
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ę:

Kopiuj
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 ?


edytowany 1x, ostatnio: Qbisiek
Kandif
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 4 lata
  • Postów:231
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.


"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'"-._,-'"-.,-'
edytowany 2x, ostatnio: Kandif
Qbisiek
no właśnie ze stackOverflow wziąłem swoje kopiowanie :P
Kandif
A spróbuj tym pierwszym kopiowaniem, może akurat zadziała :D.
airborn
  • Rejestracja:prawie 16 lat
  • Ostatnio:prawie 7 lat
  • Postów:274
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.

Qbisiek
  • Rejestracja:około 12 lat
  • Ostatnio:około 10 lat
  • Postów:160
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);


Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.