[Java] 2D AffineTransform oid?

Pagina: 1
Acties:

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 13:51

Janoz

Moderator Devschuur®

!litemod

Topicstarter
Ik ben bezig met een ontwerp, en daarbij wil ik gebruik gaan maken van Java2D. Ik loop tegen het volgende probleem aan.

Ik heb zeg maar een grote BufferedImage of Raster (source). Hieruit wil ik een Stuk halen en op een andere BufferedImage of Raster (destination) zetten. De source is een bv een kaart van de wereld. De destination kan de hele kaart zijn, maar kan ook alleen een paar landen zijn. Daarnaast moet de destination ook gedraaid kunnen zijn.

In eerste instantie dacht ik aan een AffineTransformation, omdat het stukje geschaald en gedraaid moet worden, maar voorzover ik nu heb kunnen vinden werkt dit alleen over het hele source beeld. Dat is nogal lastig en inefficient als je ver ingezoomd bent. Daarnaast is de destination niet rechthoekig, maar zeshoekig.

Ik kan natuurlijk gewoon de transformatie gaan doen, en vervolgens de hoeken weer weghalen (zodat ik uiteindelijk wel een zeshoek krijg), maar d'r moet vast wel een andere manier zijn.

Ik kan natuurlijk ook zelf de transformatie gaan schrijven. Het nadeel daarvan is dat ik dan ook zelf een bilineair interpolatie algoritme er in moet gaan zetten.

Is er met een AffineTransformation niet een methode om niet in 1 keer de hele image te transformeren, maar om per pixelpositie op de destination een sample (mbv bilineaire interpolatie) uit de source te nemen. Als die methode er is ben ik van een heleboel problemen af. Dan kan ik namelijk mijn orginele id gebruiken. Hierbij bestond de source eigenlijk uit 3 grijswaarde beelden. Elk van deze grijswaarde stelde dan een HSV component voor. Door dan uit alle 3 een sample te nemen zou ik dan een pixel in de destination kunnen maken. Daarnaast zou ik dan ook allen de 'veranderde' gedeeltes kunnen updaten (Zolang de transformatie natuurlijk niet veranderd is).

Nog ff een plaatje voor de duidelijkheid:
Afbeeldingslocatie: http://members.home.nl/janoz/voorbeeld_transform.gif

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Ik ben nogal een leek op Java 2D gebied, maar ik heb even rond gekeken in de API.

AffineTransform kan je instellen op een Graphics2D. Dit kan ook tijdens het tekenproces verandert worden door een andere AffineTransform.

Wat je dus kan doen is om eerst de originele afbeelding te tekenen. Daarna kan je aan een BufferedImage (die je erop wilt plaatsen) een subimage vragen met getSubimage(). Deze kan je er dan overheen tekenen, waarbij je eerst even je AffineTransform op je Graphics2D aanpast naar een AffineTransform die je wilt toepassen bij het tekenen van twee image.

Ik hoop dat dit het oplost, maar zoals ik al zei ben ik een leek op Java 2D gebied. Ik heb het nog nooit echt intensief gebruikt. Wasigh heeft een boek over Java 2D, misschien dat die nog kan bijstaan :) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment