Como fazer certas coisas em imagens 2D?

A chamada inversa vira a imagem para trás, da direita para a esquerda, ou seja, ela troca a primeira coluna pela última coluna, a segunda coluna da segunda à última coluna e assim por diante até que toda a imagem seja revertida.

A troca de chamada troca a área da imagem definida por um retângulo com largura 180 e altura 130 começando no índice de linha 50 e no índice de coluna 60 por um retângulo do mesmo tamanho começando no índice de linha 50 e no índice de coluna 260.

O deslocamento de chamada localiza uma imagem que está oculta nos dados da imagem, salvando o bit 7, deslocando os bits 0-6 uma posição para a esquerda e configurando o bit 0 para o valor salvo anteriormente do bit 7.

A troca de chamada restaura uma imagem na qual cada pixel foi embaralhado, trocando os 2 bits inferiores pelos 2 bits superiores. Para fazer isso, é necessário que seu código faça a mesma troca para restaurar a imagem.

NOTA: O valor máximo de um pixel (Picture.MAXVAL) é 255, portanto, apenas 8 bits são válidos para cada pixel. Estes são os bits numerados de 0 a 7, onde o bit 0 é igual a 1 e o bit 7 é igual a 128. Não são permitidos valores negativos.

Eu comecei a inverter para o trabalho, no entanto, consegui inverter de cabeça para baixo, não da direita para a esquerda. Alguém pode me ajudar a fazê-lo ir da direita para a esquerda? como que parte devo olhar ou como deve ser corrigida.

quanto à troca, estou perto, mas não completamente.

trocar e trocar, não sei como fazer isso.

public class pictures {

// Picture object
Picture picture = null;

// Image data
int height;
int width;
int image[][];

// Constructor
public pictures() {
    picture = new Picture();
}

// Read the image
public void readImage(String inFile) {
    System.out.println("Reading image: " + inFile);
    try {
        picture.readPGM(inFile);
        height = picture.getHeight();
        width  = picture.getWidth();
        image  = picture.getData();
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

// Write the image
public void writeImage(String outFile) {
    System.out.println("Writing image: " + outFile);
    try {
        picture.setData(image);
        picture.writePGM(outFile);
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

// Get image data
public int[][] imageData() {
    return image;
}

// Invert the image
public void invert() {

    int right;
    int left;
    for (right = 0, left = height - 1; right < left; right++, left--) {
        int[] pic = image[left];
        image[left] = image[right];
        image[right] = pic;
    }
}

// Exchange the image
public void exchange() {

    for (int col = 60; col < 240; col++)
     {
        for (int row = 50; row < 180; row++) {

            int pic= image[row][col];
            image[row][col] = image[row][col+240];
            image[row][col+240] = pic;
        }
    }
}



// Swap 
public void swap() {

    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {

            int pic = image[row][col];
            int top  = (pic & 0b11110000) >> 2;
            int bottom = (pic & 0b00001111) << 2;
            pic = top | bottom;
            image[row][col] = pic;
        }
    }
}

public void shift() {

questionAnswers(0)

yourAnswerToTheQuestion