Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 图形图像(PGraphics)提供了关于x轴镜像的不需要的双图像。处理3_Image_Double_Processing_Pgraphics - Fatal编程技术网

Image 图形图像(PGraphics)提供了关于x轴镜像的不需要的双图像。处理3

Image 图形图像(PGraphics)提供了关于x轴镜像的不需要的双图像。处理3,image,double,processing,pgraphics,Image,Double,Processing,Pgraphics,代码应该淡入淡出并将窗口的图像复制到缓冲区f,然后将f拉回到窗口上,但进行平移、旋转和缩放。我试图创造一种效果,就像当你把一个相机插入电视时,在电视上的反馈循环 我尝试了我能想到的一切,记录了我能想到的每一个变量,但似乎图像(f,0,0)做了一些错误或意外的事情 我错过了什么 关于x轴的双像镜图片: pgf; int rect_大小; int midX; int midY; 无效设置(){ 尺寸(1000,1000,P2D); f=createGraphics(宽度、高度、P2D); midX

代码应该淡入淡出并将窗口的图像复制到缓冲区f,然后将f拉回到窗口上,但进行平移、旋转和缩放。我试图创造一种效果,就像当你把一个相机插入电视时,在电视上的反馈循环

我尝试了我能想到的一切,记录了我能想到的每一个变量,但似乎图像(f,0,0)做了一些错误或意外的事情

我错过了什么

关于x轴的双像镜图片:

pgf;
int rect_大小;
int midX;
int midY;
无效设置(){
尺寸(1000,1000,P2D);
f=createGraphics(宽度、高度、P2D);
midX=宽度/2;
midY=高度/2;
矩形尺寸=300;
图像模式(中心);
矩形模式(中心);
光滑的();
背景(0,0,0);
填充(0,0);
中风(255255);
}
作废提款(){
淡入和复制像素(f);//淡入窗口像素,然后将像素复制到f
背景(0,0,0);//没有背景,角点不会被重新绘制。
//变换显示窗口(而不是f)
pushMatrix();
浮点缩放=0.90;//x>1会使图像变大
浮动旋转=5;//角度(度)
平移(midX,midY);//使旋转始终围绕中心旋转
旋转(弧度(旋转));
比例(缩放);
图像模式(中心);
image(f,0,0);//奇怪的双图像一定有什么东西在这里不起作用
popMatrix();//将窗口矩阵返回到正常状态
int x=鼠标;
int y=老鼠;
矩形模式(中心);
rect(x,y,rect_大小,rect_大小);
}
//淡入窗口像素,然后将像素复制到f
无效淡入淡出和复制像素(PGF){
loadPixels();//加载windows像素。不需要,因为我只读取像素?
f、 loadPixels();//加载反馈循环像素
//循环浏览窗口中的每个像素
//从像素[]数组抓取数据更快,所以不要使用get和set,使用这个
对于(int i=0;i>16;
INTG=(p&0x0000FF00)>>8;
int b=p&0x000000FF;//不需要移位
//按比例减少每种颜色的值
//介于0-1之间,表示0完全透明,1完全无
//最小值为0.0039(当使用地板功能和255作为颜色的molorModes时)
浮动衰减率=0.005;//0.05=5%
int r_new=地板(浮动(r)-(浮动(r)*衰减百分比);
int g_new=地板(浮动(g)-(浮动(g)*衰减百分比);
int b_new=地板(浮动(b)-(浮动(b)*衰减百分比);
//也许以后会以一种保存差异的方式进行重写,并以不同的方式进行取整,比如可能先快后慢,
//这一轮不起作用,因为它从来没有先减去一才能使球滚动
//地板的最小值是每次都要从每个值中减去1。不能只从n个循环中减去1
//保留所有浮动像素的列表?内存太多?
//我现在坚持地板
//对地板产生影响的最低百分比为0.0039?…因为这略高于1/255
//向后移动或同时移动

p=0xFF000000|(r_new这是一个奇怪的问题。但让我们从一个更简单的MCVE开始,它可以隔离问题:

PGraphics f;
void setup() {
  size(500, 500, P2D);
  f = createGraphics(width, height, P2D);
}

void draw() {
  background(0);
  rect(mouseX, mouseY, 100, 100);
  copyPixels(f); 
  image(f, 0, 0);
}

void copyPixels(PGraphics f) {
  loadPixels();
  f.loadPixels(); 

  for (int i = 0; i < pixels.length; i++) {
    color p = pixels[i];
    f.pixels[i] = p;
  }
  f.updatePixels();
}
pgf;
无效设置(){
尺寸(500500,P2D);
f=createGraphics(宽度、高度、P2D);
}
作废提款(){
背景(0);
rect(mouseX,mouseY,100100);
复制像素(f);
图像(f,0,0);
}
空拷贝像素(PGF){
loadPixels();
f、 loadPixels();
对于(int i=0;i
这段代码显示的问题与您的代码相同,没有任何额外的逻辑。我希望这段代码在鼠标所在的位置显示一个矩形,但它在X轴上反射的位置显示一个矩形。如果鼠标位于窗口顶部,则矩形位于窗口底部,反之亦然

认为这是由于
P2D
渲染器是OpenGL造成的,它有一个反转的Y轴(0在底部而不是顶部)。因此,当你复制像素时,它似乎是从屏幕空间转到OpenGL空间…或者其他什么。这看起来确实有问题

目前,有两件事似乎可以解决这个问题。首先,您可以使用默认渲染器而不是
P2D
。这似乎可以解决这个问题

或者你可以去掉
copyPixels()
函数中的
for
循环,现在只需执行
f.pixels=pixels;
。这似乎也解决了问题,但还是让人觉得很麻烦

如果明天有人(呼叫乔治)没有提供更好的解释,我会提交一个bug。(如果你愿意,我可以帮你。)

编辑:我已经提交了一个问题,希望我们能在接下来的几天内收到开发者的回复


编辑两个:看起来修复程序已经实施,应该可以在下一个处理版本中使用。如果您现在需要,您可以随时从源代码构建处理。

一个更简单的解决方案,就像一个魔咒一样工作:

在使用f之前和之后添加f.beginDraw();和f.endDraw();:

loadPixels();  //load windows pixels. dont need because I am only reading pixels?
  f.loadPixels(); //loads feedback loops pixels
  // Loop through every pixel in window
  //it is faster to grab data from pixels[] array, so dont use get and set, use this

  f.beginDraw();

处理必须知道何时在缓冲区中绘制,何时不绘制


哇,非常感谢您这么快的回答!您提到的修复程序…我如何“使用默认渲染器而不是P2D”?此外,如果我第一次复制“f.pixels=pixels”,我认为我的淡入淡出和复制功能会很好地工作然后做了算法的淡入淡出部分,所以我也可以尝试一下。如果你能为我提交这个bug,我将不胜感激。我一直很困惑,但你的解释让我明白了一些。如果我得到了什么,我会让你知道的
f.updatePixels(); 
  f.endDraw();