处理x轴上的镜像?

Ast*_*ine 1 processing image mirroring

我能够将图像复制到该位置,但无法镜像它。我缺少什么?

PImage img; 
float srcY;
float srcX;
int destX;
int destY;

img = loadImage("http://oldpalmgolfclub.com/wp-content/uploads/2012/02/Palm- Beach-State-College2-e1329949470871.jpg");

size(img.width, img.height * 2);

image(img, 0, 0);
image(img, 0, 330);

int num_pixels = img.width * img.height;

int copiedWidth = 319 - 254;
int copiedHeight = 85 - 22;
int startX = (width / 2) - (copiedWidth / 2);
int startY = (height / 2) - (copiedHeight / 2);
Run Code Online (Sandbox Code Playgroud)

Geo*_*nza 5

简单地在 x 轴上缩放 -1 怎么样?

PImage img; 

img = loadImage("https://processing.org/img/processing-web.png");

size(img.width, img.height * 2);

image(img,0,0);
scale(-1,1);//flip on X axis
image(img,-img.width,img.height);//draw offset
Run Code Online (Sandbox Code Playgroud)

这也可以通过操纵像素来实现,但需要一些算术:

PImage img; 

img = loadImage("https://processing.org/img/processing-web.png");
size(img.width, img.height * 2);

int t = millis();

PImage flipped = createImage(img.width,img.height,RGB);//create a new image with the same dimensions
for(int i = 0 ; i < flipped.pixels.length; i++){       //loop through each pixel
  int srcX = i % flipped.width;                        //calculate source(original) x position
  int dstX = flipped.width-srcX-1;                     //calculate destination(flipped) x position = (maximum-x-1)
  int y    = i / flipped.width;                        //calculate y coordinate
  flipped.pixels[y*flipped.width+dstX] = img.pixels[i];//write the destination(x flipped) pixel based on the current pixel  
}
//y*width+x is to convert from x,y to pixel array index
flipped.updatePixels()
println("done in " + (millis()-t) + "ms");

image(img,0,0);
image(flipped,0,img.height);
Run Code Online (Sandbox Code Playgroud)

上述可以使用get()set()来实现,但使用pixels[]数组更快。单个 for 循环通常比使用 2 个嵌套 for 循环使用 x,y 计数器遍历图像要快:

PImage img; 

img = loadImage("https://processing.org/img/processing-web.png");
size(img.width, img.height * 2);

int t = millis();
PImage flipped = createImage(img.width,img.height,RGB);//create a new image with the same dimensions
for(int y = 0; y < img.height; y++){
  for(int x = 0; x < img.width; x++){
    flipped.set(img.width-x-1,y,img.get(x,y));
  }
}
println("done in " + (millis()-t) + "ms");

image(img,0,0);
image(flipped,0,img.height);
Run Code Online (Sandbox Code Playgroud)

您可以在单个 for 循环中复制 1px 的“切片”/列,这会更快(但仍然不如直接像素操作快):

PImage img; 

img = loadImage("https://processing.org/img/processing-web.png");
size(img.width, img.height * 2);

int t = millis();

PImage flipped = createImage(img.width,img.height,RGB);//create a new image with the same dimensions
for(int x = 0 ; x < flipped.width; x++){               //loop through each columns
  flipped.set(flipped.width-x-1,0,img.get(x,0,1,img.height));       //copy a column in reverse x order
}

println("done in " + (millis()-t) + "ms");

image(img,0,0);
image(flipped,0,img.height);
Run Code Online (Sandbox Code Playgroud)

还有其他替代方案,例如访问 java BufferedImage(尽管这意味着处理草图主要在 Java 模式下工作)或使用 PShader,但这些方法更加复杂。保持事情简单通常是个好主意(尤其是在开始时)。