Wrote this little program that takes a master image (local), splits it into pages (because it's big), and reproduces it with tiles (taken from Flikr) based on averaged colors. On the back of each sheet is a page number, so we know ho to put them back order. All works great! very pleased! But for some reason, i get a blank page every 5 pages... why? Master image size is currently 4771 x 3181px
Also, this code probably needs some optimization, but that's another topic.
/**
* This code is copyright (c) Mathias Markl 2016 (the imageLoader part)
*
* This program is free software: you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation, either version 2 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
import at.mukprojects.imageloader.*;
import at.mukprojects.imageloader.flickr.*;
import at.mukprojects.imageloader.image.*;
import processing.pdf.*;
PGraphicsPDF pdf;
ImageLoader loader;
ImageList list;
Image img;
String apiKey = "xxxx";
String apiSecret = "xxxx";
PImage master = new PImage();
PImage cover = new PImage();
int maxImages = 50;
int detail = 50;
int loaderOn = 1;
int extra;
PImage[] myImages = new PImage[50];
StringList imageSorter = new StringList(0);
int c=0;
int i=0;
int j =0;
int k =0;
int n =0;
int o=0;
//// Image Thingies
PImage baseImage;
int baseIndex=5;
int maxHeight=900;
int maxWidth=900;
int rounderY;
int rounderX;
IntList rTile = new IntList(0);
IntList gTile = new IntList(0);
IntList bTile = new IntList(0);
int rBase;
int gBase;
int bBase;
IntList cRVar = new IntList(0);
IntList cGVar = new IntList(0);
IntList cBVar = new IntList(0);
IntList cVar = new IntList(0);
IntList targetArray = new IntList(0);
int target;
int page=1;
PFont noPage;
void setup() {
size(1000, 1000);
loader = new FlickrLoader(this, apiKey, apiSecret);
list = loader.start("sunset", false, 60*1000);
master=loadImage("master.jpg");
pdf = (PGraphicsPDF)beginRecord(PDF, "Lines.pdf");
frameRate (60);
}
void draw() {
if (loaderOn==1) {
println("retrieved "+list.size()+" photos");
//println(list.getIds());
// Remove Duplicates
if (list.size()==maxImages) {
for (int b=0; b<maxImages; b++) {
if (imageSorter.size()==0) {
img = list.getImage(k);
imageSorter.append(img.getImgUrl());
k++;
} else if (imageSorter.size()>0) {
img = list.getImage(k);
if (imageSorter.get(imageSorter.size()-1)==img.getImgUrl()) {
k++;
} else {
imageSorter.append(img.getImgUrl());
k++;
}
}
}
// Resizing all the funzies!
println("LOADING IMAGES INTO PIMAGE ARRAY AND RESIZING");
for (int i=0; i<imageSorter.size(); i++) {
myImages[i]=loadImage(imageSorter.get(i), "jpg");
myImages[i].resize(detail, detail);
}
// Tile Pixel Averaging Baby Boy
println("LOADING AND AVERAGING TILE PIXEL COLORS");
for (int i=0; i<imageSorter.size(); i++) {
myImages[i].loadPixels();
color r = 0, g = 0, b = 0;
for (color c : myImages[i].pixels) {
r += c >> 020 & 0xFF;
g += c >> 010 & 0xFF;
b += c & 0xFF;
}
r /= myImages[i].pixels.length;
g /= myImages[i].pixels.length;
b /= myImages[i].pixels.length;
rTile.append(r);
gTile.append(g);
bTile.append(b);
}
println("DONE");
loader.stop();
list=null;
loaderOn=0;
}
}
// Fonctions répetées à chaques page //
if (loaderOn==0) {
// Découpage du master en pages (imageBase)
for (int v=0; v<master.height; v+=height) {
for (int w=0; w<master.width; w+=width) {
baseImage=master.get(v, w, width, height);
// Découpage de la page en détails
for (i=0; i<baseImage.width; i+=detail) {
for (j=0; j<baseImage.height; j+=detail) {
println("LOADING AND AVERAGING DETAIL COLORS"+" "+"DETAIL NO"+" "+(i+j));
PImage newImg = baseImage.get(i, j, detail, detail);
// Analyze de la couleur de chaque détail
newImg.loadPixels();
color rBase = 0, gBase = 0, bBase = 0;
for (color c : newImg.pixels) {
rBase += c >> 020 & 0xFF;
gBase += c >> 010 & 0xFF;
bBase += c & 0xFF;
}
rBase /= newImg.pixels.length;
gBase /= newImg.pixels.length;
bBase /= newImg.pixels.length;
if ((rBase+gBase+bBase)==0) {
fill(255);
noStroke();
rect(i, j, detail, detail);
} else {
// Calcule de détail le plus près de l'image de base
println("ANALYSING TILE COLOR PROXIMITY");
for (k=0; k<maxImages; k++) {
cRVar.append(abs(rBase-rTile.get(k)));
cGVar.append(abs(gBase-gTile.get(k)));
cBVar.append(abs(bBase-bTile.get(k)));
cVar.append(cRVar.get(k)+cGVar.get(k)+cBVar.get(k));
println("APPROX TILE NO"+k );
}
target = cVar.index(cVar.min());
println("MATHCHING TILE="+target);
image(myImages[target], i, j);
println("CLEARING ALL VARIABLES");
c=o;
k=0;
n=o;
o=0;
cRVar.clear();
cGVar.clear();
cBVar.clear();
cVar.clear();
println("PRINTING TILE "+(i+j));
}
}
}
i=0;
j=0;
//baseImage.resize(0, 250);
//image(baseImage, width-baseImage.width, height-baseImage.height);
pdf.nextPage();
PFont noPage = createFont("Helvetica", 100, true);
textFont(noPage, 500);
fill(225);
textAlign(CENTER, CENTER);
text(page, width/2, height/2);
pdf.nextPage();
page++;
}
}
cover=master;
if (cover.width>cover.height) {
cover.resize(width-200, 0);
rounderY = (cover.height%20);
cover.resize(width-200, cover.height-rounderY);
} else if (cover.width<cover.height) {
cover.resize(0, height-200);
rounderX = (cover.width%20);
cover.resize(cover.width-rounderX, height-200);
}
PFont noPage = createFont("Helvetica", 100, true);
textAlign(CENTER, CENTER);
textFont(noPage, 20);
text("Mosaïc Poster Maker", width/2, ((height-cover.height)/2)-100);
text("Jonathan Mélançon", width/2, ((height+cover.height)/2)+100);
imageMode(CENTER);
image(cover, width/2, height/2);
endRecord();
println("PDF DONE!");
exit();
}
}