====== Écologie numérique - Modifier la résolution d'une image ====== ====== Intention ====== Dans un principe d'écologie numérique, j'aimerai créer un variateur qui permet de transformer une image et de la compresser. L'idée est donc de **diminuer la résolution d'une image en actionnant des potentiomètres**. Pour l'instant j'ai réussis à diviser l'image en tableaux, l'idée étant ensuite de pouvoir éliminer certaines parties pour voir jusqu'où l'on peut dégrader l'image tout en la laissant visible. ===== Schéma de fonctionnement ===== {{:wiki:flossmanuals:flossmanuals:ecologienumerique:floss.jpg|}} ===== Schéma technique ===== {{:wiki:flossmanuals:flossmanuals:ecologienumerique:floss_bb.jpg|}} ===== Programme Arduino ===== int firstSensor = 0; // first analog sensor int secondSensor = 0; // second analog sensor int inByte = 0; // incoming serial byte void setup() { // start serial port at 9600 bps: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for native USB port only } establishContact(); // send a byte to establish contact until receiver responds } void loop() { // if we get a valid byte, read analog ins: if (Serial.available() > 0) { // get incoming byte: inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255: firstSensor = analogRead(A0) / 4; // delay 10ms to let the ADC recover: delay(10); // read second analog input, divide by 4 to make the range 0-255: secondSensor = analogRead(1) / 4; // read switch, map it to 0 or 255L // send sensor values: Serial.write(firstSensor); Serial.write(secondSensor); } } void establishContact() { while (Serial.available() <= 0) { Serial.print('A'); // send a capital A delay(300); } } ===== Programme Processing===== import processing.serial.*; PFont font; PGraphics pg; PImage img; // communication ARduino Serial myPort; // The serial port int[] serialInArray = new int[3]; // Where we'll put what we receive int serialCount = 0; // A count of how many bytes we receive int x, y; // Starting position of the ball boolean firstContact = false; // Whether we've heard from the microcontroller void setup() { size(800, 800, P2D); img = loadImage("thibbckgpetite.jpg"); //font = createFont("ARIAL.TTF", 600); pg = createGraphics(800, 800, P2D); // paramètres de distorsion x = width/2; y = height/2; // Print a list of the serial ports, for debugging purposes: printArray(Serial.list()); // I know that the first port in the serial list on my mac // is always my FTDI adaptor, so I open Serial.list()[0]. // On Windows machines, this generally opens COM1. // Open whatever port is the one you're using. String portName = Serial.list()[2]; myPort = new Serial(this, portName, 9600); } void draw() { background(0); // PGraphics pg.beginDraw(); pg.background(0); pg.fill(255); //pg.textFont(font); pg.textSize(800); pg.pushMatrix(); pg.translate(width/2, height/2-215); pg.textAlign(CENTER, CENTER); pg.image(img, 0, 0); pg.popMatrix(); pg.endDraw(); int tilesX = x+2; int tilesY = y+2; int tileW = int(width/tilesX); int tileH = int(height/tilesY); for (int y = 0; y < tilesY; y++) { for (int x = 0; x < tilesX; x++) { // WARP int wave = int(sin(frameCount * 0.05 + ( x * y ) * 0.07) * 20); // SOURCE int sx = x*tileW+ wave; int sy = y*tileH; int sw = tileW; int sh = tileH; // DESTINATION int dx = x*tileW; int dy = y*tileH; int dw = tileW; int dh = tileH; copy(pg, sx, sy, sw, sh, dx, dy, dw, dh); } } } void serialEvent(Serial myPort) { // read a byte from the serial port: int inByte = myPort.read(); // if this is the first byte received, and it's an A, // clear the serial buffer and note that you've // had first contact from the microcontroller. // Otherwise, add the incoming byte to the array: if (firstContact == false) { if (inByte == 'A') { myPort.clear(); // clear the serial port buffer firstContact = true; // you've had first contact from the microcontroller myPort.write('A'); // ask for more } } else { // Add the latest byte from the serial port to array: serialInArray[serialCount] = inByte; serialCount++; // If we have 2 bytes: if (serialCount > 1 ) { x = (int)map(serialInArray[0],0,255,0,width); y = (int)map(serialInArray[1],0,255,0,height); // print the values (for debugging purposes only): println(x + "\t" + y ); // Send a capital A to request new sensor readings: myPort.write('A'); // Reset serialCount: serialCount = 0; } } }