是否在x轴上处理镜像? [英] Processing mirror image over x axis?

查看:91
本文介绍了是否在x轴上处理镜像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够将图像复制到该位置,但无法对其进行镜像.我想念什么?

I was able to copy the image to the location but not able to mirror it. what am i missing?

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

推荐答案

在x轴上按-1缩放比例如何?

How about simply scaling by -1 on the x axis ?

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

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

This can be achieved by manipulating pixels as well, but needs a bit of arithmetic:

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()像素[] 数组速度更快.通常,单个for循环比使用2个嵌套的for循环通过x,y计数器遍历图像要快:

The above can be achieved using get() and set(), but using the pixels[] array is faster. A single for loop is generally faster than using 2 nested for loops to traverse the image with x,y counters:

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的切片"/列,并且速度更快(但仍不如直接像素操作快):

You can copy a 1px 'slice'/column in a single for loop and which is faster(but still not as fast as direct pixel manipulation):

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 (尽管这意味着Processing草图大部分将在Java模式下工作)或使用PShader,但是这些方法更为复杂.通常,使事情简单(尤其是在入门时)是个好主意.

There are other alternatives like accessing the java BufferedImage (although this means the Processing sketch will work in Java Mode mostly) or using a PShader, but these approaches are more complex. It's generally a good idea to keep things simple (especially when getting started).

这篇关于是否在x轴上处理镜像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆