Jak wyswietlac sprajty

0

Witam

Czy ktos mogl by mi napisac przykladowy kodzik wyswietlajacy sprajta (chodzi mi o to zeby czarne tlo obrazka bylo przezroczyste) z wykorzystaniem BufferedImage

Pozdrawiam

0

nie wiem, czy ci to dobrze podam, ale powiem co ja uważam na ten temat...
w javie każdy pixel opisany jest przez cztery bajty (A R G B), gdzie rgb to kolor a A oznacza przezroczystość tego pixela, jeśli więc chcesz np. żeby obrazek był całkowicie przezroczysty to ustawiasz mu pixele na punkt|0xff000000, czyli dwa najstarsze bity zawsze na 0xff (jeśli ff to maksymalnie przezroczysty [???] bo jeśli przezroczysty to 0x00 wtedy musisz ustawić punkt&0x00ffffff, co wyzeruje te dwa bity. Spróbuj obu wariantów bo nie wiem dokładnie).
W każdym razie powyższą operację przeprowadzasz dla każdego pixela czyli np dla bufferedimage będzie to tak:
for(int i=0;i<bi.getHeight();i++) //bi-BufferedImage
for(int j=0;j<bi.getWidth();j++){
int old=bi.getRGB(i,j);
old|=0xff000000; //ewentulanie old&=0x00ffffff;
if((old&0x00ffffff)==0) //jeśli rgb=0, czli pixel jest idealnie czarny
old|=0xff000000; //ewentulanie old|=0xff000000;
bi.setRGB(i,j,old);
}

0

Powiem tak NIE DZIALA - wydaje sie ze setRGB i getRGB zwracaja, ustawiaja jedynie 3 bajty - nie wazne czy najstarszy bajt zamaskuje 0xff, czy 0x00 - po prostu nic sie nie zmienia. Co innego jesli zamaskuje dowolny bajt koloru - wtedy zmiany widac "golym okiem" ;P

Ponizej moje wypocinki - tak dla jasnosci

Tak tworze obiekt

imgPocisk = new BufferedImage(128,128, BufferedImage.TYPE_INT_ARGB);

A tu funkcja konwersji

void ConvertImgToSprite(BufferedImage img, int imgW, int imgH)
{
    int tmpCol;
    int transpCol=img.getRGB(0,0); //pobieramy kolor tla
    for (int h=0; h<imgH; h++)
        {
	    for (int w=0; w<imgW; w++)
                {
		    tmpCol=img.getRGB(w,h);
		    if (tmpCol==transpCol)
		        {
			    img.setRGB(w,h, tmpCol|0xff000000);	
			}	
		}
	}
}

Ma ktos inne pomysly

0

ależ zmienia tylko tego nie widać...
po prostu jeśli msz za tło jakiś obrazek i on ma powiedzmy mieć czasne punkty to wzrokowo nam się wydaje, że on ma, lecz jeśli obadamy piksel liczbowo, to nie musi wcale on mieć wartości liczbowej 0
BufferedImage bi=new BufferedImage(ii.getIconWidth(),ii.getIconHeight(),BufferedImage.TYPE_4BYTE_ABGR); //deklaracja bi, stworzony z imageicon
i potem......
for(int i=0;i<bi.getHeight();i++)
for(int j=0;j<bi.getWidth();j++){
int pixel=bi.getRGB(j,i);
int r=pixel&0x00ff0000;
int g=pixel&0x0000ff00;
int b=pixel&0x000000ff; //B bez zmian
r=r>>16; //zeskalowanie R
g=g>>8; //zeskalowanie G
if((r+g+b)<100) //ustalamy sobie jakiś próg czułości
pixel=0xffffffff;
bi.setRGB(j,i,pixel);
}

bez powyższego if-a jeśli chciałem aby podał mi wszystkie idelalnie czarne piksele to z obrazka 400*300 na konsoli wyrzucał około 10 pikseli
powyższy kod jest sprawdzony i działa

0

Nie tu nie chodzi o prog czulosci - tlo pod zdjeciem jest idelnie czarne (to zdjecie zostalo specjalnie przygotowane z mysla o wyswietlaniu sprajtow) poza tym jesli uzyje:

img.setRGB(w,h, tmpCol|0x000000ff); bede mial idealnie niebieskie tlo (stad m. in wiem ze tlo ma jednolity kolor - bo bajt B kazdego z pikseli zostal podmieniony)

ale jesli zastosuje
img.setRGB(w,h, tmpCol|0xff000000); tlo wcale nie stanie sie przezroczyste

qrcze moze to przez to ImageIcon u mnie fotka ladowana jest bezposrednio z pliku:
imgCel = ImageIO.read(new File("Cel.bmp"));

0

mam identyczny problem. może to ImageIcon ma coś do tego? ustawiałem alfę gimpem i również tło nie było przeźroczyste.

//ustawienie tła gimpem jednak daje rezultat, miałem błąd w kodzie

ok, rozwiązałem swój problem. ponieważ ustawianie alfy dla oryginału nic nie dawało, to stworzyłem nowy BufferedImage, który ma alfę defaultowo ustawioną na 0x00 (btw. pełna przeźroczystość to właśnie 0x00, nie 0xff) i skopiowałem do niego wszystkie piksele oprócz pikseli tła.

public void setImageBackgroundTransparent(File imgFile) throws IOException
{
	BufferedImage src=ImageIO.read(imgFile);
	BufferedImage dest=new BufferedImage(src.getWidth(), src.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
			
	int i,j;
	int pixel, r, g, b;
	for(i=0; i<src.getWidth(); i++)
	{
		for(j=0; j<src.getHeight(); j++)
		{
			pixel=src.getRGB(i,j);
				
			r=(pixel>>16)&0xff;
			g=(pixel>>8)&0xff;
			b=pixel&0xff;
					
			if((r!=255)||(g!=255)||(b!=255)) dest.setRGB(i,j, pixel);
				
		}
	}
		
	ImageIO.write(dest, "png", imgFile);
}

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