Rainbowlify An Image


23

Questa sfida riguarda lo spostamento graduale delle tonalità in un'immagine per creare belle immagini come questa:

grande notte stellata ( originale )

Sfida

Scrivi un programma o una funzione che accetta due numeri interi non negativi e un'immagine in qualsiasi formato di file immagine comune di tua scelta (puoi prendere un percorso per l'immagine o i dati dell'immagine grezza).

Chiameremo il primo numero intero i cicli e il secondo numero intero il offset .

Definiremo anche il passaggio in virgola mobile come cicli 360 volte divisi per l'area dell'immagine, oppure step = 360 * cycles / (image width * image height).

Per ogni pixel P nell'immagine, spostando una riga alla volta, da sinistra a destra, dall'alto verso il basso (ovvero nell'ordine di lettura se i pixel fossero lettere), procedi come segue:

  1. Aumenta la tonalità di P di offset gradi (passando da 360 a 0 se necessario).

  2. Quindi aumentare l' offset per passo .

Salva, visualizza o visualizza in modo grezzo l'immagine risultante in qualsiasi formato di file immagine comune.

Questa procedura aumenta in modo incrementale la tonalità di tutti i pixel dell'immagine, facendo cicli a ciclo completo attorno all'arcobaleno di tonalità , iniziando a compensare inizialmente la tonalità per offset .

Quando i cicli sono 1 e l' offset è 0, come nell'immagine Notte stellata sopra, le righe superiore e inferiore di pixel non hanno praticamente alcun cambiamento di tonalità ma tra un ciclo a colori e l'altro.

Dettagli

  • I cicli possono essere qualsiasi numero intero non negativo ma si può presumere che l' offset sia compreso tra 0 e 359 inclusi.

  • Quando i cicli sono 0, ogni pixel dell'immagine avrà la sua tonalità spostata di esattamente l' offset poiché anche il passaggio deve essere 0. (In questo caso se offset è 0, l'immagine non cambia affatto.)

  • È possibile supporre che cicli e offset siano immessi come float se lo si desidera (ovvero 1.0anziché 1). (Mi rendo conto che non devono essere affatto numeri interi, rende la sfida più semplice.)

  • "Tonalità" si riferisce alla versione dello spazio colore RGB, comune nei modelli di colore HSL / HSV .

Esempi

Originale:

fiume

Cicli = 1, offset = 0:

uscita del fiume 1

Cicli = 1, offset = 180:

uscita del fiume 2

Originale:

sfere

Cicli = 2, offset = 60:

uscita delle sfere

Originale:

tramonto
(Grazie ArtOfCode .)

Cicli = 1, offset = 120:

uscita al tramonto

Originale:

maniglia
(Grazie Doorknob .)

Cicli = 1, offset = 0:

uscita maniglia 1

Cicli = 4, offset = 0:

uscita maniglia 2

Cicli = 200, offset = 0:

uscita della maniglia 3

Cicli = 30000, offset = 0:

uscita maniglia della porta 4

(Queste immagini potrebbero non essere perfette per i pixel a causa della compressione di imgur.)

punteggio

Vince il codice più breve in byte. Tiebreaker è la risposta più votata.

Le risposte che pubblicano le loro immagini di prova dall'aspetto accattivante otterranno da me più punti brownie.


6
Sembra che Doorknob stia fumando una pentola.
Denker,

Presumo un array di numeri interi come valore di ritorno sarebbe incluso in "o output raw"?
Marv,

2
@Marv No. Intendo che i byte grezzi dell'immagine (nel formato comune scelto, diciamo ppm ) possono essere reindirizzati direttamente allo stdout.
Calvin's Hobbies,

2
Gli output devono essere identici ai tuoi esempi? Ricevo immagini leggermente diverse.
DJMcMayhem

1
@DrGreenEggsandHamDJ Se non riesci a distinguere visivamente una differenza, probabilmente va bene. La perfezione dei pixel non è necessaria (imgur potrebbe aver compresso le mie immagini in modo perdita comunque).
Calvin's Hobbies

Risposte:


8

Pyth, 86 byte, programma completo

=N.tE7=Z*6*.n0cEl.n'zMmhtS[0255ss*VG.>+Lc-1.tH1 3[.tH1Kc.tH0@3 2_K)d)3.wmmgk~-NZd'z

Pyth non ha conversioni di spazio colore integrate: questo è il vero affare.

Accetta input nel seguente formato su stdin:

input_filename.png
offset
cycles

L'immagine di output viene scritta in o.png.


Funziona ruotando il cubo di colore attorno alla sua diagonale, quindi bloccando tutti i valori al di fuori dell'intervallo.

Se aè l'angolo da ruotare, ed r, g, bè il colore di input, calcoliamo il nuovo colore r', g', b'per:

o = cos(a), i = sin(a) / sqrt(3)
n = (1 - o) / 3
m = [n + o, n - i, n + i]
clamp(c) = max(0, min(255, c))
r' = clamp(r*m[0] + g*m[1] + b*m[2])
g' = clamp(r*m[2] + g*m[0] + b*m[1])
b' = clamp(r*m[1] + g*m[2] + b*m[0])

6

Python, 379 byte

from PIL.Image import*
from colorsys import*
def f(H,c,I):
 i=open(I);x,y=i.size;S=1.*c/(x*y);r,g,b=i.split();R=[];G=[];B=[]
 for x,y,z in zip(r.getdata(),g.getdata(),b.getdata()):
  e=255.;h,s,v=rgb_to_hsv(x/e,y/e,z/e);t=hsv_to_rgb(h+H,s,v);H=H+S%1.;x,y,z=[int(x*e)for x in t];R.append(x);G.append(y);B.append(z)
 p=Image.putdata;p(r,R);p(g,G);p(b,B);return merge('RGB',(r,g,b))

Questo porta a un .jpginput come input. Non funzionerà con png, anche se puoi cambiare r,g,b=i.split();in r,g,b=i.split()[:3];per caricare un'immagine png.

Ecco alcune immagini:

Originale:

inserisci qui la descrizione dell'immagine

Offset: 0, Cicli: 4

inserisci qui la descrizione dell'immagine

Originale:

inserisci qui la descrizione dell'immagine

Offset 0, 1 ciclo:

inserisci qui la descrizione dell'immagine

Originale:

inserisci qui la descrizione dell'immagine

Offset 0, 2,5 cicli:

inserisci qui la descrizione dell'immagine


6

Java (programma completo), 491 488 byte (grazie a @Geobits)

import java.awt.*;import java.io.*;import static javax.imageio.ImageIO.*;class Q{public static void main(String[]v)throws Exception{File f=new File(v[2]);java.awt.image.BufferedImage b=read(f);for(int i=0,j,h=b.getHeight(),w=b.getWidth();i<h;i++)for(j=0;j<w;){Color c=new Color(b.getRGB(j,i));float[]a=new float[3];c.RGBtoHSB(c.getRed(),c.getGreen(),c.getBlue(),a);b.setRGB(j++,i,c.HSBtoRGB((a[0]+Float.valueOf(v[1])/360+(i*w+j)*Float.valueOf(v[0])/w/h)%1,a[1],a[2]));}write(b,"png",f);}}

Ungolfed

import java.awt.*;
import java.io.*;

import static javax.imageio.ImageIO.*;

class A79200 {
    public static void main(String[] v) throws Exception {
        File file = new File(v[2]);
        java.awt.image.BufferedImage image = read(file);
        for (int i = 0, j, height = image.getHeight(), width = image.getWidth(); i < height; i++)
            for (j = 0; j < width; ) {
                Color color = new Color(image.getRGB(j, i));
                float[] arr = new float[3];
                color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), arr);
                image.setRGB(j++, i, color.HSBtoRGB((arr[0] + Float.valueOf(v[1]) / 360 + (i * width + j) * Float.valueOf(v[0]) / width / height) % 1, arr[1], arr[2]));
            }
        write(image, "png", file);
    }
}

Spiegazione

  • Utilizzo: abbastanza semplice. Compila con java -c Q.java. Corri con java Q <cycles> <offset> <imagepath>. Sostituirà l'immagine esistente, quindi fai attenzione.

  • All'inizio stavo per fare una soluzione solo con metodo, ma non sapevo come gestire le importazioni, quindi ho pensato che sarei diventato completamente , questo probabilmente non vincerà comunque: ^)

risultati:

Image 1: 1 cycle, 0 offset

1

Image 1: 1 cycle, 180 offset

2

Image 2: 2 cycles, 60 offset

3

Image 3: 1 cycle, 120 offset

4

Image 4: 1 cycle, 0 offset

5

Image 4: 4 cycles, 0 offset

6

Image 4: 200 cycles, 0 offset

7

Bonus: The Starry Night, 1 cycle, 0 offset

inserisci qui la descrizione dell'immagine


1
Per riferimento futuro, è possibile effettuare importazioni solo per le risposte ai metodi esattamente come si farebbe normalmente. Basta metterli fuori dal corpo del metodo e contare i byte. Puoi anche qualificare completamente le classi invece di importarle se ne avrai bisogno solo una volta, per risparmiare qualche byte in alcuni casi.
Geobits,

Inoltre, c'è un motivo per cui stai importando java.io.Fileanziché java.io.*?
Geobits,

Grazie, buono a sapersi. E secondo, no, non c'è motivo. Buon punto.
Marv,

Perché import ** static**, non solo import?
Solomon Ucko,

1
In modo che io sia in grado di chiamare ImageIO::reade ImageIO::writesenza dover anteporre ImageIO.: questo aggiunge 9 byte ( static .*) ma salva 16 ( ImageIO.due volte).
Marv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.