Java: afbeeldingen roteren

Ik moet afbeeldingen afzonderlijk kunnen roteren (in java). Het enige dat ik tot nu toe heb gevonden is g2d.drawImage(image, affienetransform, ImageObserver ). Helaas moet ik de afbeelding op een specifiek punt tekenen, en er is geen methode met een argument dat 1. de afbeelding afzonderlijk roteert en 2. me in staat stelt de x en y in te stellen. alle hulp wordt gewaardeerd


Antwoord 1, autoriteit 100%

Dit is hoe je het kunt doen. Deze code gaat uit van het bestaan ​​van een gebufferde afbeelding genaamd ‘image’ (zoals je opmerking zegt)

// The required drawing location
int drawLocationX = 300;
int drawLocationY = 300;
// Rotation information
double rotationRequired = Math.toRadians (45);
double locationX = image.getWidth() / 2;
double locationY = image.getHeight() / 2;
AffineTransform tx = AffineTransform.getRotateInstance(rotationRequired, locationX, locationY);
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
// Drawing the rotated image at the required drawing locations
g2d.drawImage(op.filter(image, null), drawLocationX, drawLocationY, null);

Antwoord 2, autoriteit 33%

AffineTransform-instanties kunnen worden samengevoegd (samen opgeteld). Daarom kunt u een transformatie hebben die ‘verschuiving naar oorsprong’, ‘roteren’ en ‘terugschakelen naar gewenste positie’ combineert.


Antwoord 3, autoriteit 9%

public static BufferedImage rotateCw( BufferedImage img )
{
    int         width  = img.getWidth();
    int         height = img.getHeight();
    BufferedImage   newImage = new BufferedImage( height, width, img.getType() );
    for( int i=0 ; i < width ; i++ )
        for( int j=0 ; j < height ; j++ )
            newImage.setRGB( height-1-j, i, img.getRGB(i,j) );
    return newImage;
}

van https://coderanch.com/t/485958/java/ Roterende-gebufferde-afbeelding


Antwoord 4, autoriteit 9%

Een eenvoudige manier om het te doen zonder het gebruik van zo’n ingewikkeld draw-statement:

   //Make a backup so that we can reset our graphics object after using it.
    AffineTransform backup = g2d.getTransform();
    //rx is the x coordinate for rotation, ry is the y coordinate for rotation, and angle
    //is the angle to rotate the image. If you want to rotate around the center of an image,
    //use the image's center x and y coordinates for rx and ry.
    AffineTransform a = AffineTransform.getRotateInstance(angle, rx, ry);
    //Set our Graphics2D object to the transform
    g2d.setTransform(a);
    //Draw our image like normal
    g2d.drawImage(image, x, y, null);
    //Reset our graphics object so we can draw with it again.
    g2d.setTransform(backup);

Antwoord 5

Sorry, maar alle antwoorden zijn voor mij als beginner in graphics moeilijk te begrijpen…

Na wat gehannes werkt dit voor mij en is het gemakkelijk om over te redeneren.

@Override
public void draw(Graphics2D g) {
    AffineTransform tr = new AffineTransform();
    // X and Y are the coordinates of the image
    tr.translate((int)getX(), (int)getY());
    tr.rotate(
            Math.toRadians(this.rotationAngle),
            img.getWidth() / 2,
            img.getHeight() / 2
    );
    // img is a BufferedImage instance
    g.drawImage(img, tr, null);
}

Ik veronderstel dat als je een rechthoekige afbeelding wilt roteren, deze methode niet zal werken en de afbeelding zal knippen, maar ik denk dat je vierkante png-afbeeldingen moet maken en die moet roteren.

Other episodes