Pixels as circles.
The idea is to take an image and record the color of each pixel in an array. Each array entry is then translated into a circle which is put back in the pixels original place.

www.bjorkbc.dk/majmaj/truck.html

ImageCircle.png
int SizeH = 600;
int SizeW = 800;
PImage img;
Circle C1; // Each circle
color[] col; // Color of each pixels
 
void setup()  //---------------------------------------------
{
  size(SizeW, SizeH);
  background(0); // Dosn't really work. It's beeing written over all the time
  col = new color[80*60]; // Create as many array-entries as there is pixels
 
 C1 = new Circle(0,0,10,col); // Creates the circle with its input values. NO actual drawing here
 
}
 
void draw() //----------------------------------------------------------
{
  img = loadImage("LA_CopMotorcycle_Small.jpg");
  int count = img.width * img.height;
  // img.loadPixels();  // May be for safety, still works without
 
  loadPixels();
  for (int i = 0; i < count; i +=1) {
    col[i] = img.pixels[i];
  }
  updatePixels();
 
   for (int i = 1; i < img.height; i +=1) { //This for loop defines every the vertical line array
     C1.RenderX(i); // Render the circle a lot of times
      }
 
}
 
class Circle {
 
  // Data fields
  float  x, y, Diameter;
  color[] NewColor;
 
  // Constructor  This is where I define what/how to input data in the class
    Circle(float PosX, float PosY, float Dia,color[] Col) {
    x = PosX;
    y = PosY;
    Diameter = Dia;
    NewColor = Col;
  }
 
  // Methods
  void RenderX(int x) {  // this method create all the horizontal lines for each vertical array
  for(int i=1; i < img.width; i++) {
    fill(NewColor[x*img.width+i-1]);
    ellipse(i*10,10*x,Diameter,Diameter);
}
}
}
 

NEW!!!
int SizeH = 512;
int SizeW = 768;
int SizeT = 100; //Always use these instead of Hieght/Width when ref to the image
 
PImage img;
PImage imgOut;
 
clsPix pix; // Each circle
clsBox tab;
clsScrollbar scrollbar;
 
 
void setup()  //---------------------------------------------
{
 
  img = loadImage("truck.jpg");
 
  tab = new clsBox();
  scrollbar = new clsScrollbar(50,SizeH + 50,200,10,1.0,200.0);
 
  size(img.width,img.height + SizeT);
}
 
void draw() //----------------------------------------------------------
{
  pix = new clsPix(img,int(scrollbar.getPos()));
  image(imgOut,0,0);
 
  tab.Draw(5,SizeH+5,SizeW-5,SizeH + SizeT - 5,10,0.4);
 
  scrollbar.update(mouseX,mouseY);
  scrollbar.display();
 
 
}
 
void mousePressed() {
  scrollbar.press(mouseX,mouseY);
}
 
void mouseReleased() {
  scrollbar.release();
}
 
aclass clsPix {
  PImage imgOut;
  PImage imgIn;
 
int NextHeight = 0;
 
  clsPix(PImage img, int Jump) {
    imgIn = img;
    imgIn.loadPixels();
    imgOut = createImage(imgIn.width, imgIn.height, RGB);
 
    color col = imgIn.pixels[0];
 
 
    for (int h = 0; h < imgIn.height; h++) {
      for (int w = 0; w < imgIn.width ; w++) { // for loop begin
 
        if(w % Jump == 0) {
          col = imgIn.pixels[NextHeight*imgIn.width + w];
        }
        if(h % Jump == 0) {
          NextHeight = h;
        }
        imgOut.pixels[h*imgIn.width + w] = col;
      }
    }
 
    imgOut.updatePixels();
  }
 
  void Display(int Jump) {
    color col = imgIn.pixels[0];
 
    for (int h = 0; h < imgIn.height; h++) {
      for (int w = 0; w < imgIn.width ; w++) { // for loop begin
 
        if(w % Jump == 0) {
          col = imgIn.pixels[NextHeight*imgIn.width + w];
        }
        if(h % Jump == 0) {
          NextHeight = h;
        }
        imgOut.pixels[h*imgIn.width + w] = col;
      }
    }
    imgOut.updatePixels();
    image(imgOut,0,0);
  }
  PImage img() {
   return imgOut;
  }
 
}