Png-bild umkehren


15

Erstellen Sie ein Programm oder eine Funktion, die den Dateinamen als Argument verwendet oder von der Standardeingabe liest und die folgende Aufgabe ausführt:

  1. Liest das Bild aus einer PNG-Datei (Name als Argument angegeben).
  2. Vertauschen Sie die Farben in diesem Bild, sodass beispielsweise Dunkelgrün (0, 75, 30) zu (255, 180, 225) wird (da 255-0 = 255, 255-75 = 180 und 255-30 = 225). Sie sollten den Alpha-Kanal-Wert nicht ändern.
  3. Gib das Bild in eine Datei mit dem Namen a.png(im PNG-Format) aus oder zeige es im GUI-Fenster.

Das ist . Es gelten Standardlücken.


Müssen optionale PNG-Funktionen unterstützt werden? Sind integrierte Funktionen zum Laden / Schreiben von PNGs akzeptabel?
Sparr

Die Unterstützung optionaler @Sparr-Funktionen ist optional . Eingebaute Funktionen sind nicht explizit verboten, daher gehe ich davon aus, dass sie zulässig sind.
Hannes Karppila

4
PNG-Dateien können indiziert werden (jedes Pixel enthält einen Zeiger auf eine Farbe in der Colormap) oder TrueColor (jedes Pixel enthält die tatsächliche Farbe). Welchen müssen wir unterstützen? Können wir wählen Tatsächlich gibt es fünf verschiedene Unterformate in Bezug auf Farbe. So... ?
Luis Mendo

@ DonMuesli Ich denke, jede Methode, die das richtige Ergebnis liefert, ist in Ordnung. Sie können davon ausgehen, dass die Farbe nicht Graustufen ist und die Unterstützung von Alphakanälen optional ist. Ich denke, dass die Verwendung eines anderen Modus akzeptabel ist, solange die Aufgabe weiterhin die Farben umkehrt und Farben (r, g, b) -Werte haben.
Hannes Karppila

1
Kann ich nur CSS verwenden?
Rizze

Antworten:


30

ImageMagick display -fx, 3 7 18 24 Bytes

1-u

Das ImageMagick-Tool displaymit dem fxParameter kann das obige Programm auf eine als Parameter angegebene PNG anwenden und die Ergebnisse auf dem Bildschirm anzeigen.

Schauen Sie sich meinen Beitrag auf Meta zu ImageMagick als Programmiersprache an. Dort schrieb ich einen Prime Tester als Proof of Concept.

Re-Byte-Zählung display -fx code filenameentspricht perl -e code filename, wo wir traditionell nur codefür Länge zählen.


Ist das nicht eine Standardlücke? Es hat viele positive Stimmen bekommen, aber es scheint, als sollte es so sein. Ich denke, wenn Mathematica eine Reihe dieser Funktionen eingebaut hat, ist die Verwendung einer vorab veröffentlichten Anwendung (bevor die Frage gestellt wird) für Sie ein faires Spiel, solange sie Befehlszeilenargumente akzeptiert?
Nate Diamond

1
@NateDiamond Gib mir ungefähr 5 Minuten, um meinen Meta-Beitrag zu "Ist Imagemagick eine Programmiersprache" zu beenden, und ich werde dies auf 7 Bytes reduzieren und deine Frage gleichzeitig beantworten :)
Sparr


21

Pyth, 16 15 13 Bytes

.w-LLL255'z\a

Ausgänge zu a.png.

          z    read input
         '     read as RGB triples from file
   LLL         map over rows, then triples, then individual values...
  -   255      ...subtract from 255
.w         \a  write as image to a.png

Danke an Jakube für 2 Bytes!


4
Mann, ich muss Pyth lernen
Undergroundmonorail

1
Hat Pyth keine bitweise Negation ( ~oder ähnliches)?
Peter Taylor

@PeterTaylor Ich glaube nicht, dass es überraschenderweise funktioniert. (In jedem Fall müsste es auf 8 Bit beschränkt sein.)
Türknauf

gibt es keine möglichkeit mit einem pfn tief zu kartieren?
Ven

1
@ven @Doorknob Eigentlich kann man es tun: .w-LLL255'z\a. Aber frag mich nicht, wie das funktioniert oder warum du LLLetwas brauchst und nicht wie LMM.
Jakube

18

MATL , 10 Bytes

255iYi-IYG

Es gibt fünf verschiedene PNG- Unterformate , je nachdem, wie die Farben codiert werden. Keiner von ihnen scheint "optionaler" zu sein als die anderen. Ich habe die flexibelste gewählt Truecolor, bei der jedes Pixel eine beliebige Farbe haben kann. Der obige Code unterstützt auch das Truecolor with alphaIgnorieren des Alphakanals.

So ermitteln Sie das Farbunterformat einer PNG-Datei: Suchen Sie nach der Bytefolge [73 72 68 82]am Anfang der Datei. und das zehnte Byte von dort hat einen der fünf Werte in der oben verlinkten Tabelle .

Wie der Code funktioniert

Ziemlich einfach:

255    % push 255 to the stack
i      % input filename with extension '.png'
Yi     % read contents of that file as (truecolor) image
-      % subtract
IYG    % show image

Beispiel

Ich konnte nicht widerstehen, mich invertiert zu sehen, also lud ich dieses Bild (das im Unterformat ist Truecolor with alpha) herunter , ließ den Code laufen (zweite Zeile ist Benutzereingabe)

>> matl 255iYi-IYG
> 'C:\Users\Luis\Desktop\me.png'

und bekam

Bildbeschreibung hier eingeben


1
Dein Avatar bist eigentlich du? Ich dachte es wäre nur dein Helm! : P
Downgoat

1
Ich dachte PNG und alles bedeutet Langcode, aber 10 Bytes? Beeindruckend.
Buffer Over Read

17

Java, 295

import javax.imageio.*;class V{public static void main(String[]a)throws
Exception{java.awt.image.BufferedImage m=ImageIO.read(new
java.io.File(a[0]));for(int
x=m.getWidth(),y;x-->0;)for(y=m.getHeight();y-->0;)m.setRGB(x,y,m.getRGB(x,y)^-1>>>8);ImageIO.write(m,"png",new
java.io.File("a.png"));}}

1
Ich mag, wie x-- und x> 0 zusammen einen kleinen Pfeil ergeben, der anzeigt, dass x auf 0 steigt. Warum habe ich das noch nie gesehen / benutzt?
LuWi

Importieren java.io.File?
Nickb

1
@LuWi hehe, ich habe es schon einmal gesehen und benutzt, manche Leute nennen es den "Gehe zu" -Operator und es ist ziemlich golfen :)
aditsu

@nickb, auch wenn Sie die kürzere verwenden import java.io.*;, speichert keine Bytes, sondern erhöht die Größe.
Aditsu

4

R, 124 Bytes

p=png::readPNG(readline());p[,,-4]=1-p[,,-4];png("a.png",h=nrow(p),w=ncol(p));par(mar=rep(0,4));plot(as.raster(p));dev.off()

Liest den Dateinamen über stdin ( readline()) ein.

p=png::readPNG(readline()) #Reads in png as an RGBA array on range [0,1]
p[,,-4]=1-p[,,-4] #Takes the opposite value except on alpha layer
png("a.png",h=nrow(p),w=ncol(p)) #Prepares output png of same size as input
par(mar=rep(0,4)) #Makes the png take the full space of the figure region
plot(as.raster(p)) #Transforms p as a raster so that it can be plotted as is.
dev.off() #Closes the plotting device.

Beispiel Eingabe / Ausgabe mit dem ersten PNG, das ich auf diesem Computer gefunden habe :)

Eingang Ausgabe



2

Tcl, 176 Bytes

foreach r [[image c photo -file {*}$argv] d] {set x {}
foreach c $r {lappend x [format #%06X [expr "0xFFFFFF-0x[string ra $c 1 end]"]]}
lappend y $x}
image1 p $y
image1 w a.png

Lädt die PNG über den photoBildtyp, ruft die Bilddaten ab, konvertiert jede Zeile und Farbe durch Subtrahieren von #FFFFFF und schreibt die Datei zurück auf die Festplatte (als "a.png").

Verwenden Sie TrueColor PNGs, um die besten Ergebnisse zu erzielen, da Tk versucht, die gleiche Farbauflösung wie die Quellbilddaten zu verwenden.

Fügen Sie hinzu, um das Bild ohne Stichprobenprobleme anzuzeigen

pack [label .i -image image1]

bis zum Ende. (Dies ist natürlich länger als die Option zum Speichern von Datenträgern.)


Sie können Bytes ersetzt ave foreachdurchlmap
sergiol

2

Mathematica, 140 Bytes

Export["a.png",SetAlphaChannel[ColorCombine[Most@#],Last@#]&@MapAt[Image[1-ImageData@#]&,ColorSeparate[Import[#],{"R","G","B","A"}],{;;3}]]&

Beachten Sie, dass Sie zwei Bytes sparen können, indem Sie Import[#]auf Import@#und für ändern ColorCombine[Most@#].
Numbermaniac

Warum wäre eine einfache ColorNegate@*Importnicht eine vollständige Antwort?
LegionMammal978


2

Julia, 94 79 Bytes

using FileIO
save(ARGS[1],map(x->typeof(x)(1-x.r,1-x.g,1-x.b,1),load(ARGS[1])))

Dies ist ein vollständiges Programm, das einen Dateinamen als Befehlszeilenargument verwendet und die angegebene Datei mit dem invertierten Bild überschreibt. Es setzt voraus , dass die FileIOund ImagePaket installiert werden. Letzteres muss jedoch nicht importiert werden.

Rufen Sie das Programm über die Kommandozeile wie folgt auf julia filename.jl /path/to/image.png.

Ungolfed:

using FileIO # required for reading and writing image files

# Load the given image into a matrix where each element is an RGBA value
a = load(ARGS[1])

# Construct a new image matrix as the inverse of `a` by, for each element
# `x` in `a`, constructing a new RGBA value as 1 - the RGB portions of
# `x`, but with an alpha of 1 to avoid transparency.
b = map(x -> typeof(x)(1 - x.r, 1 - x.g, 1 - x.b, 1), a)

# Save the image using the same filename
save(ARGS[1], b)

Beispiel:

regulär invertiert


1
Die Elster (?) Sieht auf dem zweiten Bild ernsthaft niedergeschlagen aus.
Bálint

1

Python + PIL, 85 Bytes

from PIL import Image
lambda a:Image.eval(Image.open(a),lambda x:255-x).save('a.png')

Dies definiert eine anonyme Funktion, die einen Dateinamen als Zeichenfolge verwendet und das resultierende Bild in speichert a.png.

Testlauf:

Lama Lama raus


1
-3 Bytes from PIL import Image as I, gefolgt durch das Ersetzen Imagein der Funktion mitI
Tim Čas

Ich bin mir ziemlich sicher, dass das einfach import Imagefunktioniert und eine ganze Menge Bytes wegnimmt
Beta-Zerfall

Speichern Sie 11 Bytes mitfrom PIL.Image import*
Aaron

Ich denke, dies kehrt versehentlich auch den Alpha-Kanal um. Anscheinend evalläuft die Funktion gegen alle "Bänder", einschließlich der Alpha-Band. Folgendes erhalte
dana

1
@dana Gemäß dem Kommentar des OP ist die Unterstützung von Alpha-Kanälen optional.
Mego

1

C + stb_image + stb_image_write, 175 162 Bytes (oder + 72 =247 234)

Meine erste Einsendung auf dieser Seite.

#include"stb_image.h"
#include"stb_image_write.h"
x,y,c,i;f(char*d){d=stbi_load(d,&x,&y,&c,i=0);for(;i<x*y*c;i++)d[i]=255-d[i];stbi_write_png("a.png",x,y,c,d,0);}

Könnte wohl ein paar Bytes abschneiden. Die stb_*Implementierung muss entweder in einer separaten Bibliothek oder am Anfang dieser Datei erfolgen mit:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Ich habe es nicht in die Zählung aufgenommen, da es im Wesentlichen Teil der Bibliothek ist (insbesondere, wenn es separat kompiliert wurde). +72 Bytes, um dies bei Bedarf hinzuzufügen.


Update 1:

Realisiert, dass nur eine Funktion (im Gegensatz zu einem gesamten Programm) akzeptabel ist und 15 Bytes wegnimmt. Die alte Implementierung (die ein gesamtes Programm ist) dient als Referenz:

x,y,i;main(int c,char**d){*d=stbi_load(d[1],&x,&y,&c,0);for(;i<x*y*c;i++)i[*d]=255-i[*d];stbi_write_png("a.png",x,y,c,*d,0);}

1

Java, 300 298 Bytes

import javax.swing.*;void c(String f)throws Exception{java.awt.image.BufferedImage r=javax.imageio.ImageIO.read(new java.io.File(f));for(int i=0;i++<r.getWidth();)for(int j=0;j++<r.getHeight();)r.setRGB(i,j,(0xFFFFFF-r.getRGB(i,j))|0xFF000000);JOptionPane.showMessageDialog(null,new ImageIcon(r));}

1

MATLAB / Octave, 31 Bytes

Code:

imshow(imcomplement(imread(x)))

Beispiel:

imshow(imcomplement(imread('balloons.png')))

Bildbeschreibung hier eingeben              Bildbeschreibung hier eingeben

Erläuterung:

Lesen Sie das Bild xaus einer Grafikdatei, ergänzen Sie das Bild und zeigen Sie es dann an.


Der Code setzt voraus, dass dies xvordefiniert ist, was nicht zulässig ist. Sie können es mit in eine Lambda-Funktion für +4 Bytes verwandeln @(x).
Mego

0

FFmpeg, 10 Bytes

Bearbeiten: Nehmen Sie ein Stichwort aus @ Sparrs Antwort

-vf negate

(Wenn das obige Feld zusammen mit dem Bildnamen an ffplay übergeben wird, wird das negierte Bild angezeigt.)


ffplay %1 -vf negate

Das Obige wird als Batch-Datei gespeichert.


1
Ist FFmpeg eine Programmiersprache nach unseren Maßstäben? Ich weiß nicht genug darüber, um sicher zu sein. Vielleicht nach Meta fragen?
Mego

0

Schläger 282 Bytes

(λ(fname)(let*((i(make-object bitmap% fname))(w(send i get-width))(h(send i get-height))(pixels(make-bytes(* w h 4)))(i2(make-object bitmap% w h)))
(send i get-argb-pixels 0 0 w h pixels)(send i2 set-argb-pixels 0 0 w h(list->bytes(map(lambda(x)(- 255 x))(bytes->list pixels))))i2))

Mehr lesbare Form:

(define(f fname)
  (let*(
        (i (make-object bitmap% fname))
        (w (send i get-width))
        (h (send i get-height))
        (pixels (make-bytes(* w h 4)))
        (i2 (make-object bitmap% w h)))
    (send i get-argb-pixels 0 0 w h pixels)
    (send i2 set-argb-pixels 0 0 w h
          (list->bytes
           (map
            (lambda(x) (- 255 x))
            (bytes->list pixels))))
    i2))

Verwendung:

(f "myimg.png")

0

Golang, 311 Bytes

package main
import("image"
."image/png"
."image/color"
."os")
func main(){f,_:=Open(Args[1])
i,_:=Decode(f)
q:=i.Bounds()
n:=image.NewRGBA(q)
s:=q.Size()
for x:=0;x<s.X;x++{for y:=0;y<s.Y;y++{r,g,b,a:=i.At(x,y).RGBA()
n.Set(x,y,RGBA{byte(255-r),byte(255-g),byte(255-b),byte(a)})}}
o,_:=Create("o")
Encode(o,n)}

ungolfed

package main
import(
    "image"
    "image/png"
    "image/color"
    "os"
)

func main(){
    // open a png image.
    f, _ := os.Open(Args[1])

    // decode the png image to a positive image object(PIO).
    p, _ := png.Decode(f)

    // get a rectangle from the PIO.
    q := p.Bounds()

    // create a negative image object(NIO).
    n := image.NewRGBA(q)

    // get the size of the PIO.
    s := q.Size()

    // invert the PIO.
    for x := 0; x < s.X; x++ {
        for y := 0; y < s.Y; y++ {
            // fetch the value of a pixel from the POI.
            r, g, b, a := p.At(x, y).RGBA()

            // set the value of an inverted pixel to the NIO.
            // Note: byte is an alias for uint8 in Golang.
            n.Set(x, y, color.RGBA{uint8(255-r), uint8(255-g), uint8(255-b), uint8(a)})
        }
    }

    // create an output file.
    o, _ := os.Create("out.png")


    // output a png image from the NIO.
    png.Encode(o, n)
}

0

Python 2 + OpenCV , 55 Byte

import cv2
cv2.imwrite('a.png',255-cv2.imread(input()))

Die OpenCV-Bibliothek verwendet NumPy-Arrays zum Lesen, Verarbeiten und Schreiben von Bildern. Unten sehen Sie ein Beispiel für dieses Skript, das ein auf mozilla.org gefundenes Bild invertiert .

Randgrafik invertiert

Alle Kanäle, einschließlich des Alphakanals, werden invertiert. Dies ist problematisch für Bilder mit Transparenz. Wie @Mego jedoch ausführte, ist die Unterstützung des Alpha-Kanals optional.

Unten finden Sie eine kommentierte 82-Byte-Version, die den Alphakanal verarbeitet.

import cv2                # import OpenCV library
i=cv2.imread(input(),-1)  # image file name is specified from stdin
                          # read with the IMREAD_UNCHANGED option
                          # to preserve transparency
i[:,:,:3]=255-i[:,:,:3]   # invert R,G,B channels
cv2.imwrite('a.png',i)    # output to a file named a.png

Wie unten gezeigt, wird das Umkehren des Firefox-Logos ordnungsgemäß gehandhabt, während der transparente Hintergrund beibehalten wird.

Firefox-Logo invertiert

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.