Sortieren Sie die Pixel


35

Ihre Aufgabe ist es, ein Programm zu erstellen, das bei gegebenem Eingabebild ein Ausgabebild derselben Größe erstellt, wobei alle Pixel nach Hexadezimalwerten sortiert sind.

Ihr Programm kann:

  • Sortieren Sie die Pixel von links nach rechts und dann nach unten oder sortieren Sie sie zuerst in Spalten und dann nach rechts. In jedem Fall ist das obere linke Pixel das kleinste und das untere rechte das größte.
  • Verwenden Sie Transparenz, dies ist jedoch nicht erforderlich.
  • Sortieren Sie nach RGB, aber Sie können CMY oder ein anderes Format mit mindestens 3 Werten verwenden. Sie können auswählen, nach welchen Werten sortiert werden soll. (HSV kann einige schöne Bilder geben)
  • Verwenden Sie jedes bekannte Bildformat, das die meisten Computer öffnen können.

Regeln:

  • Die Ausgabe muss auf die Festplatte geschrieben oder in eine Datei umgeleitet werden.
  • Die Eingabe erfolgt als Befehlszeilenargument in Form eines relativen Pfads zum Bild oder über die Befehlszeile.
  • Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Antworten:


20

Pyth - 10 Bytes

Liest das Bild, reduziert die Bitmap, sortiert und teilt die Bitmap erneut auf und schreibt dann.

.wclK'zSsK

Funktioniert aus offensichtlichen Gründen nicht online. Nimmt Eingaben als relativen Pfad zur Bilddatei und gibt sie in aus o.png.

Ausgabe von American Gothic:


3
Ich hoffe, ich bin nicht der einzige, der den Eindruck hat, dass sich das Bild bewegt ...
Quentin

Es sieht aus wie Holz.
Joe Z.

19

JavaScript (ES6), 383 377 354 Byte

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([].concat(...[...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k)).slice(12*w*h)),x.putImageData(D,0,0),d.body.appendChild(c)}}

Beispielausgabe

Lauffähige Demo:

Wie dieser Code funktioniert, wird verwendet getImageData, um ein Array des Formulars abzurufen

[R,G,B,A,
 R,G,B,A,
 R,G,B,A,
 ...]

Und mapes zu einem Array der Form

[[R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [R,G,B,A],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 ...]

Damit werden die R-Werte auf Arrays des RGBA-Satzes abgebildet, und die B-, G- und A-Werte werden zu Null-Arrays mit dem Mindestwert. Wenn wir dieses Array sortieren, werden alle [0,0,0,0]Arrays nach unten und die Real-Value-Arrays nach oben sortiert:

[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0],
 [0,0,0,0],..., [R,G,B,A],[R,G,B,A],[R,G,B,A],...]
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
               extract & flatten these sorted pixels

Wir überfliegen das obere Viertel des Arrays (um die von uns erstellten leeren Werte zu verlieren), reduzieren es mit [].concat.applyund erhalten wieder ein Array des ersten Formulars, aber dieses Mal ist es sortiert.

Leicht entgolft mit Leerzeichen und Kommentaren:

f=s=>{ 
  // first, load image, then do everything else onload
  i=new Image,
  i.src = s,
  i.onload=$=>{
    // set up the canvas
    d=document,
    c=d.createElement`canvas`,
    w=c.width=i.width,
    h=c.height=i.height,
    x=c.getContext`2d`,

    // draw image to canvas and capture pixel data
    x.drawImage(i,0,0),
    D=x.getImageData(0,0,w,h),
    t=D.data,

    // set pixel data to...
    t.set(
      // the flattened array...
      [].concat(...
        // that is a mapping of the pixel data...
        [...t].map(
          // that clumps RGBA families into subarrays
          // by replacing every fourth value with [R,G,B,A]
          // and all other values to [0,0,0,0]...
          (v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)
        )
        // and is then sorted...
        .sort(
          // by reducing each array to a positive, negative, or zero
          // by comparing R,G,B,& A until the first nonzero difference
          (a,b)=>a.some((v,i)=>k=v-b[i])&&k
        )
      )
      // then eliminate the low-sorted empty [0,0,0,0] values we created,
      // leaving only the top fourth, with real values
      // (note that 3*4*w*h is the same as 3*t.length)
      .slice(3*4*w*h)
    ),

    // now that `t` is set, store `D` in canvas
    x.putImageData(D,0,0),

    // show canvas
    d.body.appendChild(c)
  }
}

Beachten Sie, dass die meisten Browser diesen Code für große Bilder möglicherweise nicht ausführen können, da eine große Anzahl von Argumenten übergeben wird [].concat. Wenn die Browserumgebung nicht genügend Speicher für alle Argumente zulässt, können Sie alternativ die RGBA-Werte aus den oberen vierten Arrays erneut auf das Array abbilden, um eine Gesamtbewertung von 361 Byte zu erhalten :

f=s=>{d=document,i=new Image,i.src=s,i.onload=$=>{c=d.createElement`canvas`,x=c.getContext`2d`,c.width=w=i.width,c.height=h=i.height,x.drawImage(i,0,0),D=x.getImageData(0,0,w,h),t=D.data,t.set([...t].map((v,i,T)=>i%4?[,,,0]:T.slice(i,i+4)).sort((a,b)=>a.some((v,i)=>k=v-b[i])&&k).map((v,i,A)=>A[3*w*h+(i>>2)][i%4])),x.putImageData(D,0,0),d.body.appendChild(c)}}

Wir ersetzen einfach das [].concat(...{stuff}).slice(12*w*h)mit {stuff}.map((v,i,A)=>A[3*w*h+(i>>2)][i%4]).)


Könnten Sie eine Beispielausgabe hinzufügen?
Paŭlo Ebermann

@ PaŭloEbermann Fertig.
Apsillers

@insertusernamehere Oh, verdammt, ich habe nur auf kleinen Bildern getestet. Mein concat.applyAufruf liefert zu viele Argumente concatund die JS-Engine lehnt dies ab. D:Vielen Dank! Ich werde das beheben und die beiden Ergebnisse notieren. (Und ich bin froh, dass ich helfen konnte!)
Apsillers

@insertusernamehere Danke für den Hinweis zur Größenbeschränkung; Ich habe jetzt auch eine etwas längere Version veröffentlicht, die auf größeren Bildern funktioniert.
Apsillers

@apsillers Gute Arbeit. Kann leider nicht nochmal upvoten. :)
insertusernamehere

14

Mathematica 86 83 72 Bytes

 f=Flatten;Image[f[Sort[f[s=ImageData@#1,1]]]~ArrayReshape~Dimensions@s]&

Mit 14 Bytes dank @Martin Buttner gespart.


Beispiel

Das Bild selbst wird eingegeben. Alternativ könnte eine Variable verwendet werden, die das Bild enthält.

gotisch


Die Aufforderung gibt an, dass Pixel nach Hex-Werten sortiert werden sollen. Wenn ich dies jedoch richtig lese, verwenden Sie die Standard-Sortierung von Mathematica für {R, G, B} - oder {R, G, B, alpha} -Listen. Mir ist nicht klar, dass diese gleichwertig sind.
Michael Stern

@MichaelStern Ich kenne Mathematica nicht, aber wenn es Tupel wie die meisten Sprachen elementweise sortiert, sind sie äquivalent: Zahlen wie hex werden nach jeder Ziffer sortiert, von denen zwei durch jedes Element im Tupel dargestellt werden.
Maltysen

@MichaelStern, Maltysen ist richtig. Die RGB-Sortierung und die Hex-Sortierung sind gleichwertig: Die Sortierung nach R, dann nach G und dann nach B funktioniert genauso wie die Sortierung nach Ortswerten in Hex.
DavidC

OK, +1 von mir.
Michael Stern

ImageDataund ArrayReshapekönnte Infixnotation verwenden. Flattenist lang genug, um ein paar Bytes zu sparen, indem Sie es zuweisen f. Und brauchst du eigentlich "Byte"? Würde der Standard nicht einfach die Kanalwerte so skalieren, [0,1]dass die Sortierung und Bildrekonstruktion immer noch einwandfrei funktionieren würden?
Martin Ender

5

Javascript ES6, 334 Bytes

f=s=>{with((d=document).body.appendChild(c=d.createElement`canvas`).getContext`2d`)(i=new Image).src=s,drawImage(i,0,0,w=c.width=i.width,h=c.height=i.height),t=(g=getImageData(0,0,w,h)).data,t.set([...t].map(i=>(0+i.toString(16)).slice(-2)).join``.match(/.{8}/g).sort().join``.match(/../g).map(i=>parseInt(i,16))),putImageData(g,0,0)}

Ungolfed:

f=s=>{                                   // create function that accepts image name
 with((d=document).body.appendChild(     // use "with" to exclude having to prepend "<context2d>." to drawImage, getImageData and putImageData
   c=d.createElement`canvas`).getContext`2d`) // create canvas to get pixels from and draw output to
  (i=new Image).src=s,                   // create image, define source filename
  drawImage(i,0,0,w=c.width=i.width,     // draw image to canvas
                  h=c.height=i.height),
  t=(g=getImageData(0,0,w,h)).data,      // get image data from canvas in form of Uint8Array
  t.set([...t]                           // convert image data from Uint8Array to standard array
   .map(i=>(0+i.toString(16)).slice(-2)) // convert R,G,B,A bytes to base16 strings with leading zeros
   .join``.match(/.{8}/g)                // convert array of [R,G,B,A,R,G,B,A,...] to [RGBA,RGBA,...]
   .sort()                               // sort pixel values
   .join``.match(/../g)                  // convert array of [RGBA,RGBA,...] to [R,G,B,A,R,G,B,A,...]
   .map(i=>parseInt(i,16))),             // convert hex strings back to integers, reassign to image data
  putImageData(g,0,0)                    // dump image data onto canvas
}

@insertusernamehere Funktioniert auf dem neuesten Firefox. Wie bei Ihrer Antwort wird davon ausgegangen, dass ein Textkörper vorhanden ist, an den die Zeichenfläche angehängt werden kann, und dass das Quellbild aus derselben Domäne stammt.
Dendrobium

+1 Sehr schlanke Lösung. Es werden auch Bilder mit einer Auflösung von bis zu 1600 x 1900 Pixel verarbeitet.
insertusernamehere

2
Heute habe ich erfahren, dass appendChilddas seine Argumentation erwidert. Sehr hilfreich! Sie haben mich dazu inspiriert, meinen Eintrag von 377 auf 354 zu reduzieren, aber ich kann Ihren nicht ganz übertreffen :). (Wenn ich deine appendChildVerkettung und withTechnik verwende, kann ich es auf 347 bringen, aber immer noch auf 13!) Ausgezeichnete Arbeit!
Apsillers

5

C (unter Verwendung von SDL1.2), 333 322 315 Bytes

C ist höchstwahrscheinlich nicht das 'schärfste Messer im Regal' für diese Art von Arbeit, ich wollte es trotzdem versuchen. Tipps zur Verbesserung meiner Antwort sind willkommen. Das Programm erhält den Namen der Eingabebilddatei als cli-Argument.

#include <SDL.h>
#include <SDL_image.h>
#define X SDL_Surface*
#define Y const void*
C(Y a,Y b){return*(Uint32*)a-*(Uint32*)b;}main(int o,char**a){X i=IMG_Load(a[1]);X s=SDL_SetVideoMode(i->w,i->h,32,0);i=SDL_ConvertSurface(i,s->format,0);qsort(i->pixels,i->w*i->h,4,C);SDL_BlitSurface(i,0,s,0);for(;;SDL_Flip(s));}

kompilieren und ausführen: gcc -I/usr/include/SDL snippet.c -lSDL -lSDL_image && ./a.out

Bildbeschreibung hier eingeben

Ich spiele normalerweise nicht Golf in C, aber ich habe diese Herausforderung gerade beantwortet gestern und wollte einfach weiter mit diesem neuen Spielzeug spielen :)

danke an @ pseudonym117 für die hilfe beim sparen von 5 bytes


Sie können 1 Byte einsparen, indem Sie whileam Ende auf ändern. for(;;SDL_Flip(s));Ich glaube, Sie können intdie Methode weglassen Cund weitere 4 Byte einsparen.
Pseudonym117

4

JavaScript (ES6), 452 480 484 487 511 Bytes

Wow, das wurde länger als erwartet:

f=u=>{i=new Image;i.src=u;i.onload=_=>{c=(d=document).createElement`canvas`;c.width=w=i.width;c.height=h=i.height;x=c.getContext`2d`;x.drawImage(i,0,0,w,h);p=x.getImageData(0,0,w,h).data;t=[];f=[];for(j=0;j<p.length;++j)t.push([p[j],p[++j],p[++j],p[++j]]);t.sort((a,b)=>a[0]>b[0]||a[0]==b[0]&&a[1]>b[1]||a[0]==b[0]&&a[1]==b[1]&&a[2]>b[2]).map(u=>f.push.apply(f,u));x.putImageData(new ImageData(new Uint8ClampedArray(f),w,h),0,0);d.body.appendChild(c)}}

Die Funktion nimmt eine URL als Eingabe f('test.jpg');und zeichnet das Ergebnis in ein canvas-Element, das an das angehängt wird body.

Beachten Sie, dass sich die Quelle in derselben Domäne befinden muss, oder das Skript wird aufgrund eines Sicherheitsproblems angehalten.


Einschränkungen

Ich habe es in Firefox 42 unter OS X (10.10) auf einem Computer mit 2,5 GHz i7 und 16 GB RAM getestet. Die maximale Bildgröße, die ich ohne die Aufforderung von Firefox zur Fortsetzung der Skriptausführung verarbeiten konnte, betrug 1600 x 1932 px .


Ungolfed

f = u => {
    i = new Image;
    i.src = u;
    i.onload = _ => {
        c = (d = document).createElement`canvas`;
        c.width = w = i.width;
        c.height = h = i.height;

        x = c.getContext`2d`;
        x.drawImage(i, 0, 0, w, h);

        p = x.getImageData(0, 0, w, h).data;

        t = [];
        f = [];

        for (j = 0; j < p.length;++j)
            t.push([p[j], p[++j], p[++j], p[++j]]);

        t.sort( (a,b) => a[0] > b[0] || a[0] == b[0] && a[1] > b[1] || a[0] == b[0] && a[1] == b[1] && a[2] > b[2] )
         .map(u => f.push.apply(f,u));

        x.putImageData( new ImageData( new Uint8ClampedArray(f), w, h), 0, 0);
        d.body.appendChild(c)
    }
}

Ausgabe

Zum besseren Vergleich habe ich auch die " American Gothic " als Beispielquelle genommen:

Bildbeschreibung hier eingeben


Bearbeitungen

  • 24 Bytes gespart durch Verwendung von for (a in b)anstelle von for(;;). Vielen Dank an ar34z
  • Gespeichert 3 Bytes durch Speichern documentin einer Variablen.
  • 4 Bytes gespart, indem einige davon fallengelassen wurden ().
  • Gespeicherte 10 Bytes unter Verwendung von getaggten Vorlage strings , das Weglassen der ()auf der Objekterstellung und ein anderes Paar von redundanten entfernen (). Dank apsillers .
  • Einsparung von 14 Bytes durch massives Refactoring des Codes, der das Farbarray nach dem Sortieren glättet. Vielen Dank an Apsillers und Ypnypn, die sich gegenseitig unterboten haben.
  • Gespeichert 1 Byte durch die Refactoring for-loop, die die Farben jedes Pixels erhält.

1
Sie können die for-Schleifen minimieren, indem Sie for(k in t)ein paar Bytes mehr sparen :)
ar34z

1
Gute Arbeit! Einige Verbesserungen: verlieren Sie das ()in new Image(); Verwenden Sie für Ihre Zeichenfolgenargumente ( , ) mit Tags versehene Schablonenzeichenfolgen. Verwenden Sie keine Klammern für Parameter mit Einzelpfeilfunktionen (tun Sie dies einfach ; Parens sind nur für Pfeilfunktionen mit mehreren oder null Parametern verfügbar). Möglicherweise haben Sie auch ein oder zwei Schleifen mit einer Anweisung , die eckige Klammern haben, die nicht erforderlich sind. createElement`canvas`getContext`2d`f=u=>{...}for
Apsillers

Oh, tatsächlich, für Null-Argument-Pfeil-Funktionen, verwenden Sie ein Ein-Zeichen-Dummy-Argument anstelle von zwei-Zeichen-Leerzeichen. ( i.onload=$=>...anstelle von i.onload=()=>...)
Apsillers

Ich denke for(l in u)f.push(u[l]);kann werdenfor(z of u)f.push(z);
Ypnypn

@Ypnypn kann es sein , noch kürzer als das :). - for(u of t)for(z of u)f.push(z)ist ziemlich verdammt kurz, kann aber noch weiter gekürzt werden t.map(u=>u.map(z=>f.push(z))). In vielen Fällen ist die Verwendung von .mapoder .somemit einer Pfeilfunktion kürzer als die Verwendung einer forSchleife. Wenn Sie wirklich verrückt werden möchten , können Sie hier noch mehr sparen , indem Sie t.map(u=>f.push.apply(f,u));"Für jedes Array uin" als Liste von Argumenten an " via" senden (da eine unbegrenzte Anzahl von Argumenten akzeptiert werden kann und alle in die richtige Reihenfolge gebracht werden).tuf.pushapplypush
Apsillers

4

Bash + GNU-Utils, 80

s()(sed 1d $1|cut -d\  -f$2)
sed 1q $1
s $1 2-|sort -t_ -k1.16|paste <(s $1 1) -

Dies setzt voraus, dass das Eingabe- / Ausgabeformat das TXT-Format der ImageMagick-Pixel-Aufzählung aufweist. Die Eingabe wird als Dateiname übergeben und die Ausgabe geht an STDOUT.


Wenn das oben Genannte nicht als bekanntes Bildformat angesehen wird, können wir die erforderlichen Konvertierungen hinzufügen:

Bash + GNU-Utils + ImageMagick, 108

s()(sed 1d t|cut -d\  -f$1)
convert $1 txt:t
(sed 1q t
s 2-|sort -t_ -k1.16|paste <(s 1) -)|convert txt:- $2

Eingabe und Ausgabe werden als Dateinamen angegeben. ImageMagick bestimmt, welche Dateiformate von den übergebenen Dateierweiterungen verwendet werden sollen, sodass wir alle gängigen verwenden können:

$ ./sortpixels.sh 398px-Grant_Wood_-_American_Gothic_-_Google_Art_Project.jpg o.png
$ 

Das resultierende o.png sieht so aus:

Bildbeschreibung hier eingeben


3

Python 2, 128 Bytes

from PIL import*
a=Image.open('a')
b=a.load()
c,d=a.size
a.putdata(sorted(b[e,f]for f in range(d)for e in range(c)))
a.save('b')

Sofern es sich bei dem Bild um eine Datei aohne Erweiterung handelt, handelt es sich bei der Ausgabe um eine Datei bohne Erweiterung.

Amerikanische Gotik Amerikanische Gotik (sortiert)


Ich habe es nicht überprüft, aber Sie sollten in der Lage sein, etwas in der Art von zu tun a.putdata(sorted(b[f/c,f%d]for f in range(d*c)))(ich bin gerade aufgewacht, also habe ich die Variablen möglicherweise vertauscht).
Kade

Wie Sie es geschrieben haben, hat es nicht funktioniert (Index außerhalb des gültigen Bereichs), aber ich habe nicht versucht, Variablen umzuschalten (ich habe im Moment nicht viel Zeit). @Shebang
Zach Gates

3

Java, 316 Bytes

import javax.imageio.*;class C{public static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=ImageIO.read(new java.io.File(a[0]));int w=i.getWidth(),h=i.getHeight(),v[]=i.getRGB(0,0,w,h,null,0,w);java.util.Arrays.sort(v);i.setRGB(0,0,w,h,v,0,w);ImageIO.write(i,"png",new java.io.File("a.png"));}}

Platziert die Hexadezimalwerte der Pixelfarben in einem Array. Das Array wird sortiert und die Farben werden den Pixeln im Bild neu zugeordnet. Der Name des resultierenden Bildes ist a.png.

gelbe tulpen eingang gelbe Tulpen ausgegeben
American Gothic Eingang Bildbeschreibung hier eingeben


3

SmileBASIC, 39 35 Bytes

Angenommen, das Bild wird auf die 512 * 512-Grafikseite geladen:

DIM A[0]GSAVE A,0SORT A
GLOAD A,0,1

Erklärt:

DIM IMG[0] 'create array
GSAVE IMG,0 'save graphics to array
SORT IMG 'sort
GLOAD IMG,0,1 'load graphics from array

So einfach ist das! Leider müssen wir Ganzzahlen verwenden, wodurch die Programmgröße aufgrund der Typ-Suffixe um 4 Byte erhöht wird.


Ich bin mir nicht sicher, warum Ints erforderlich sind. Es scheint, als würde die Verwendung von Floats tatsächlich zu korrekten Ergebnissen führen. Wenn Sie diesen Code mit ints on ausführen, wird oben links ein und unten rechts SYS/DEFSP.GRPein eingefügt , was das offensichtliche Gegenteil der Frage ist. Die Verwendung von Schwimmern setzt oben links und unten rechts, was richtig ist. (Natürlich behandelt dies die hexadezimalen Farben als vorzeichenlosen / höheren Kanal größer, was wahrscheinlich richtig ist.)FF0000000010101000000000FFF8F8F8
snail_

Ich denke, das ist gültig, da die Frage keine bestimmte Sortierreihenfolge angibt (und da die Werte signiert sind, 0xFF000000kleiner als 0x00101010), aber ich bin mir eigentlich nicht sicher, warum ich hier Ganzzahlen verwendet habe ... Ich denke bei Zu der Zeit, als ich nicht verstand, wie GLOAD vorzeichenlose Werte verwendete, als Sie ein Float-Array verwendeten, und nur davon ausging, dass es nicht funktionierte.
12. Mai,

2

Java, 424 417 404 Bytes

Nun, das ist keine Sprache, in der du Golf spielen willst ...

import java.awt.image.*;import java.io.*;import javax.imageio.*;class F{public static void main(String[]x)throws Exception{BufferedImage i,o;i=ImageIO.read(new File(x[0]));o=new BufferedImage(i.getWidth(),i.getHeight(),BufferedImage.TYPE_INT_RGB);o.setData(i.getRaster());int[]p=((DataBufferInt)o.getRaster().getDataBuffer()).getData();java.util.Arrays.sort(p);ImageIO.write(o,"png",new File("o.png"));}}

2

C #, 497 Bytes

Erstes Mal nach dem ersten Golf. Ganz klar nicht das Beste zum Golfen

Ich respektiere die Rohrleitungen nicht wirklich. Nimmt einen Bildpfad als Eingabe und gibt ihn mit dem Buchstaben "o" vor dem Namen aus.

Funktioniert besser mit Bitmaps, Chancenergebnisse mit anderen

using System.Linq;using System.Drawing;using System.Runtime.InteropServices;class Program{static void Main(string[]args){using(var im=(Bitmap)Image.FromFile(args[0])){int h=im.Height;int w=im.Width;var b=im.LockBits(new Rectangle(0,0,w,h),System.Drawing.Imaging.ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format32bppRgb);var p=new int[h*w];Marshal.Copy(b.Scan0,p,0,h*w);var q=p.ToList();q.Sort();p=q.ToArray();Marshal.Copy(p,0,b.Scan0,h*w);im.UnlockBits(b);im.Save("o"+args[0]);}}}

1

Haskell, 195 Bytes

import Data.List
import Graphics.GD
f p=do 
 a<-loadPngFile p;(x,y)<-imageSize a;let l=[(i,j)|j<-[0..y],i<-[0..x]]
 mapM(flip getPixel a)l>>=mapM(\(d,c)->setPixel d c a).zip l.sort;savePngFile"o"a

Dies nutzt die GDBibliothek. Verwendung f <filename>. Die Eingabedatei muss im pngFormat vorliegen. Die Ausgabedatei heißto .

So funktioniert es: Unkompliziert, dh das Bild lesen, alle Koordinaten durchlaufen und die Pixel abrufen, die Pixel sortieren, die Koordinaten erneut durchlaufen, aber diesmal die Pixel in der Reihenfolge einstellen, in der sie in der sortierten Liste angezeigt werden, in die die Datei geschrieben wird Platte.

Bildbeschreibung hier eingeben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.