Изменение порядка пикселей неверно при попытке обработать и отобразить копию изображения с меньшим разрешением - PullRequest
1 голос
/ 17 марта 2012

В настоящее время я делаю приложение, использующее обработку, предназначенную для получения изображения и применения к нему обработки в 8-битном стиле: чтобы оно выглядело как пиксельное. Для этого у него есть метод, который принимает стиль и размер окна в качестве параметров (стиль - это форма, в которой должно отображаться окно - прямоугольник, эллипс, крест и т. Д., А размер окна - число от 1 до 10 в квадрате) - для получения результатов, аналогичных приложению iphone pxl (http://itunes.apple.com/us/app/pxl./id499620829?mt=8). Затем этот метод подсчитывает пиксели изображения, окно за окном усредняет цвет окна и отображает прямоугольник (или какую из выбранных форм / стилей) в эквивалентном пространстве на другой стороне окна эскиза (предполагается, что эскиз выполняется при выполнении). для отображения исходного изображения на левом зеркале его с обработанной версией справа).

Проблема, с которой я сталкиваюсь, заключается в том, что при рисовании усредненных цветовых линий порядок их отображения становится искаженным.

Screenshot of Application when run: Normal Image on the left, Skewed pixelated version of the image displayed with rects on the right (window size 4)

Screenshot of Application when run: Normal Image on the left,Skewed pixelated version of the image displayed with ellipses on the right (window size 16)

enter image description here

Хотя результаты довольно забавные, они не то, что я хочу. Вот код:

//=========================================================
//  GLOBAL VARIABLES
//=========================================================
PImage img;
public int avR, avG, avB;
private final int BLOCKS = 0, DOTS = 1, VERTICAL_CROSSES = 2, HORIZONTAL_CROSSES = 3; 
public sRGB styleColour;

//=========================================================
//  METHODS FOR AVERAGING WINDOW COLOURS, CREATING AN 
//  8 BIT REPRESENTATION OF THE IMAGE AND LOADING AN 
//                        IMAGE
//=========================================================
public sRGB averageWindowColour(color [] c){


  // RGB Variables
  float r = 0;
  float g = 0;
  float b = 0;

  // Iterator
  int i = 0;

  int sizeOfWindow = c.length;

  // Count through the window's pixels, store the
  // red, green and blue values in the RGB variables
  // and sum them into the average variables
  for(i = 0; i < c.length; i++){

     r = red  (c[i]);
     g = green(c[i]);
     b = blue (c[i]);

     avR += r;
     avG += g;
     avB += b; 
  }

  // Divide the sum of the red, green and blue
  // values by the number of pixels in the window
  // to obtain the average
  avR = avR / sizeOfWindow;
  avG = avG / sizeOfWindow;
  avB = avB / sizeOfWindow;


  // Return the colour
  return new sRGB(avR,avG,avB);
}

public void eightBitIT(int style, int windowSize){

  img.loadPixels();

  for(int wx = 0; wx < img.width; wx += (sqrt(windowSize))){
    for(int wy = 0; wy < img.height; wy += (sqrt(windowSize))){

      color [] tempCols = new color[windowSize];
      int i = 0;

      for(int x = 0; x < (sqrt(windowSize)); x ++){
        for(int y = 0; y < (sqrt(windowSize)); y ++){

          int loc = (wx+x) + (y+wy)*(img.width-windowSize);
          tempCols[i] = img.pixels[loc];
          // println("Window loc X: "+(wx+(img.width+5))+" Window loc Y: "+(wy+5)+" Window pix X: "+x+" Window Pix Y: "+y);


          i++;
        }
      }
      //this is ment to be in a switch test (0 = rect, 1 ellipse etc)

      styleColour = new sRGB(averageWindowColour(tempCols));
      //println("R: "+ red(styleColour.returnColourScaled())+" G: "+green(styleColour.returnColourScaled())+" B: "+blue(styleColour.returnColourScaled()));
      rectMode(CORNER);
      noStroke();
      fill(styleColour.returnColourScaled());
      //println("Rect Loc X: "+(wx+(img.width+5))+" Y: "+(wy+5));
      ellipse(wx+(img.width+5),wy+5,sqrt(windowSize),sqrt(windowSize));

    }

  }
}
public PImage load(String s){

  PImage temp = loadImage(s);
  temp.resize(600,470);
  return temp;

}
void setup(){
  background(0);

  // Load the image and set size of screen to its size*2 + the borders 
  // and display the image. 
  img = loadImage("oscilloscope.jpg");
  size(img.width*2+15,(img.height+10));
  frameRate(25);
  image(img,5,5);

  // Draw the borders
  strokeWeight(5);
  stroke(255);
  rectMode(CORNERS);
  noFill();
  rect(2.5,2.5,img.width+3,height-3);
  rect(img.width+2.5,2.5,width-3,height-3);
  stroke(255,0,0);
  strokeWeight(1);
  rect(5,5,9,9); //window example
  // process the image
  eightBitIT(BLOCKS, 16);
}
void draw(){
  //eightBitIT(BLOCKS, 4);
  //println("X: "+mouseX+" Y: "+mouseY);

} 

Это уже давно меня беспокоит, так как я не вижу, где в моем коде я смещаю координаты, поэтому они отображаются следующим образом. Я знаю, что это, вероятно, что-то очень тривиальное, но я, кажется, могу решить это. Если бы кто-нибудь мог определить, почему происходит этот перекос, я был бы очень благодарен, поскольку у меня есть много других идей, которые я хочу реализовать, и это сдерживает меня ...

Спасибо

...