2012-12-24, 15:39
  #1
Medlem
Jag vill trimma en bild, dvs ta bort onödig utrymme(canvas) på bilden.
Exempel:
http://www.n0.se/v/f/f9c3b_example.png
Jag vill ha koordinaten på den punkt som visas på bilden, även bredden på storleken.
Hur kan jag räkna ut detta?
Citera
2012-12-25, 12:31
  #2
Medlem
Jooncs avatar
Vad du vill göra är väl gå igenom bilden pixelrad efter pixelrad, uppifrån, och slänga bort alla "tomma" rader? När du stöter på en pixel med information bryter du och tar den raden som den första raden i den trimmade bilden. Sen vill du göra samma sak för varje kolumn, för att hitta punkten x-värde.

Edit: pixedata fås genom getRGB(int x, int y) för en BufferedImage, och vad en "tom" rad är beror på hur du definierar det. Med RGBa är det tex rimligt att titta på alpha-värdet. Med RGB bör det kanske definieras som pixelvärdet (255,255,255), dvs vit.
__________________
Senast redigerad av Joonc 2012-12-25 kl. 12:35.
Citera
2012-12-25, 23:33
  #3
Medlem
Citat:
Ursprungligen postat av dethalvabarnet
Ser rätt självklart ut från att titta på ditt exempel om jag ska vara ärlig.
Så enkelt är det inte jävla pajas.

Löste det så här:
Kod:
	int x1 = 0, y1 = 0,
		x2 = 0, y2 = 0;
	
	Outer:
	for (int y = 0; y < img.getHeight(); y++)
		for (int x = 0; x < img.getWidth(); x++)
			if (img.getRGB(x, y) != 0)
			{
				y1 = y;
				break Outer;
			}
	
	Outer:
	for (int x = 0; x < img.getWidth(); x++)
		for (int y = 0; y < img.getHeight(); y++)
			if (img.getRGB(x, y) != 0)
			{
				x1 = x;
				break Outer;
			}
	
	Outer:
	for (int y = img.getHeight () - 1; y >= 0; y--)
		for (int x = img.getWidth () - 1; x >= 0; x--)
			if (img.getRGB (x, y) != 0)
			{
				y2 = y;
				break Outer;
			}
			
	Outer:
	for (int x = img.getWidth () - 1; x >= 0; x--)
		for (int y = img.getHeight () - 1; y >= 0; y--)
			if (img.getRGB (x, y) != 0)
			{
				x2 = x;
				break Outer;
			}
	
	BufferedImage trimmedImg = img.getSubimage(x1, y1, x2-x1, y2-y1);
Citera
2012-12-26, 13:20
  #4
Medlem
Jooncs avatar
if (img.getRGB(x, y) != 0)

Jag tror du behöver vara försiktig med konstanter här. Tex har
java.awt.Color.WHITE.getRGB()
värdet -1
Detta beror på att dess binära representation är 32 ettor, och med tvåkomplement räknas MSB (most significant bit) negativt. 111....11 blir därför
-2^32 + ∑(i = 31...0) 2^i = -1.

Du borde också notera beskrivningen av BufferedImage metod getRGB():

Citat:
Returns the RGB value representing the color in the default sRGB ColorModel. (Bits 24-31 are alpha, 16-23 are red, 8-15 are green, 0-7 are blue).

Pixlar utan genomskinlighet har alpha-värdet 255. Vad din kodrad

if (img.getRGB(x, y) != 0)

letar efter är alltså genomskinliga svarta pixlar.
Citera
2012-12-26, 21:56
  #5
Medlem
Okej, låter rimligt. Kan man lösa det med typ, att bit shifta bort 6 bytes, så att bara alphan återstår, och sedan kolla om den är noll? För getRBG returnerar en int som ser ut så här: 0xRRGGBBAA. Så att ta bit shifta bort RRGGBB borde väl fungera?
Citera
2012-12-28, 13:16
  #6
Medlem
Jooncs avatar
Citat:
Ursprungligen postat av Un-named
Okej, låter rimligt. Kan man lösa det med typ, att bit shifta bort 6 bytes, så att bara alphan återstår, och sedan kolla om den är noll? För getRBG returnerar en int som ser ut så här: 0xRRGGBBAA. Så att ta bit shifta bort RRGGBB borde väl fungera?

Ja det fungerar, men kom ihåg att tex "RR" motsvarar EN byte, inte TVÅ. En hexadecimal siffra kan innehålla värden från 0-15, alltså sexton kombinationer, och motsvarar 4 bitar (2^4 = 16). Du vill bit-shifta 24 bitar, 3 bytes.
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in