Photo as pattern
Nach einer langen durchgemachten Nacht sieht man am nächsten morgen vielleicht nicht mehr so scharf wie am Abend davor. Da habe ich mir gedacht, warum dieses Phänomen nicht übertragen auf unsere Hausaufgabe. Ich wollte aus mehr weniger machen und das in ein ein Muster wiedergeben. Ich habe versucht das Bild (welches ich mit meiner Canon EOS D1100 geschossen habe und etwas mit Photoshop bearbeitet habe) in verschiedene Muster zu unterteilen.
Umsetzung
Das Bild wird mit der rect-Funktion generiert. Die Parameter für Breite und Höhe sind gleich, sodass immer Quadrate gezeichnet werden. Der Wert wird in der Variablen block vorgehalten. In den Variablen spalten und Zeilen werden die entsprechenden Zustände des geladenen Bildes abgelegt. Ist der Wert für block = 1, bleiben diese jedoch unverändert. Mit den Laufvariablen i und j, die Zwischenvariablen sind, werden die Koordinaten in Form von Spalten und Zeilen angefahren. Die Variable block wird mit i und j multipliziert um die Koordinaten (x und y) zu berechnen. Diese dienen zur Positionierung der einzelnen Pixeln im Bild. Dann werden noch die erlaubten Spalten und Zeilen berechnet. Danach die Füllfarbe für das Quadrat gesetzt.
Ich habe ein paar Parametern etwas Interaktivität gegeben:
Nach oben drücken heißt die block Variable vergrößern,
nach unten heißt die block Variable verkleinern.
Nach links heißt strokeWeight verkleinern,
nach rechts strokeWeight vergrößern.
Bevor strokeWeight eine sichtbare Änderung im angezeigten Bild vorweist, muss man über die Taste "s" das Verhalten erst einmal aktivieren.
Eine nochmalige Betätigung reaktiviert sie wieder.
Statt aus Rechtecken kann man sich auch ein aus Kreisen zusammengesetztes Bild anzeigen lassen und zwar mit der Taste "k".
Wenn man auf "r" drückt kommt man wieder zu den Rechtecken.
Program
PImage meinBild;
int anzahlPixel;
int MODE = 1;
int block = 6;
int weight = 1;
boolean noStrokeFlag = true;
void setup()
{
size(500, 334);
smooth();
meinBild = loadImage("final_homework_caspar.jpg");
}
void draw(){
background(0);
color col = 0;
int zeilen, spalten;
if (block < 1) {
block = 1;
}
if (weight < 0) {
weight = 0;
}
strokeWeight(weight);
spalten = meinBild.width / block;
zeilen = meinBild.height / block;
meinBild.loadPixels();
for (int i = 0; i < spalten; i++) {
for (int j = 0; j < zeilen; j++) {
int x = i * block;
int y = j * block;
int index = x + y * meinBild.width;
color c = meinBild.pixels[index];
fill(c);
if (noStrokeFlag) {
noStroke();
}
else {
stroke(0);
}
if (MODE == 1) {
rect(x, y, block, block);
}
else {
ellipse(x, y, block, block);
}
}
meinBild.updatePixels();
}
}
void keyPressed(){
if (key == CODED) {
switch(keyCode) {
case UP:
block++;
break;
case DOWN:
block--;
break;
case LEFT:
weight--;
break;
case RIGHT:
weight++;
break;
}
}
else {
switch(key) {
case 'r':
MODE = 1;
break; // Rechteck
case 'k':
MODE = 2;
break; // Kreis
case 's':
noStrokeFlag = !noStrokeFlag;
break; // Linie an / aus
}
}
}
File:Processing einfuehrung johannes.zip