在x轴上处理镜像?

时间:2015-03-29 20:18:49

标签: image processing 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);

1 个答案:

答案 0 :(得分:4)

如何在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

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

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);

使用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);

您可以在单个for循环中复制1px&#39; slice&#39; /列,但速度更快(但仍然没有直接像素操作那么快):

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);

还有其他选择,比如访问java BufferedImage(虽然这意味着处理草图主要在Java模式下工作)或使用PShader,但这些方法更复杂。保持简单(特别是在入门时)通常是一个好主意。