Inverser l'image png


15

Créez un programme ou une fonction qui prend le nom de fichier comme argument ou le lit à partir de l'entrée standard et termine la tâche suivante:

  1. Lire l'image à partir d'un fichier png (nom donné en argument).
  2. Inversez les couleurs dans cette image, de sorte que par exemple le vert foncé (0, 75, 30) deviendrait (255, 180, 225) (car 255-0 = 255, 255-75 = 180 et 255-30 = 225). Vous ne devez pas modifier la valeur du canal alpha.
  3. Exportez cette image dans un fichier appelé a.png(au format png) ou affichez-la dans la fenêtre GUI.

C'est du . Des échappatoires standard s'appliquent.


Est-il nécessaire de prendre en charge les fonctionnalités png en option? Les fonctions de chargement / écriture png intégrées sont-elles acceptables?
Sparr

@Sparr La prise en charge des fonctionnalités facultatives est facultative . Les fonctions intégrées ne sont pas explicitement interdites, je suppose donc qu'elles sont autorisées.
Hannes Karppila

5
Les fichiers PNG peuvent être indexés (chaque pixel contient un pointeur sur une couleur de la palette de couleurs) ou truecolor (chaque pixel contient la couleur réelle). Lequel devons-nous soutenir? Pouvons-nous choisir? En fait, il existe cinq sous-formats différents concernant la couleur. Donc... ?
Luis Mendo

@DonMuesli Je pense que toute méthode qui fournit un résultat correct sera très bien. Vous pouvez supposer que la couleur n'est pas en niveaux de gris et que la prise en charge du canal alpha est facultative. Je pense que l'utilisation de tout autre mode est acceptable, tant que la tâche inversera toujours les couleurs et que les couleurs auront des valeurs (r, g, b).
Hannes Karppila

1
Puis-je utiliser uniquement CSS?
Rizze

Réponses:


30

ImageMagick display -fx, 3 7 18 24 octets

1-u

L'outil ImageMagick displayavec le fxparamètre peut appliquer le programme ci-dessus à un png donné comme paramètre et afficher les résultats à l'écran.

Consultez mon post sur meta sur ImageMagick en tant que langage de programmation. J'ai écrit un testeur principal là-bas comme preuve de concept.

Le comptage des octets display -fx code filenameest équivalent à perl -e code filename, où nous comptons traditionnellement juste codepour la longueur.


N'est-ce pas une échappatoire standard? Il a obtenu beaucoup de votes positifs, mais il semble que ce devrait être le cas. Je suppose que si Mathematica peut avoir un tas de ces fonctions intégrées, alors utiliser n'importe quelle application pré-publiée (avant de poser la question) pour le faire pour vous est un jeu équitable, tant qu'il accepte les arguments de ligne de commande?
Nate Diamond

1
@NateDiamond Donnez-moi environ 5 minutes pour terminer mon meta post sur "est imagemagick un langage de programmation" et je vais le réduire à 7 octets et répondre à votre question en même temps :)
Sparr


21

Pyth, 16 15 13 octets

.w-LLL255'z\a

Sorties vers 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

Merci à Jakube pour 2 octets!


4
mec, je dois apprendre le pyth
undergroundmonorail

1
Pyth n'a-t-il pas de négation au niveau du bit ( ~ou similaire)?
Peter Taylor

@PeterTaylor Je ne pense pas que ce soit le cas, étonnamment. (Dans tous les cas, il devrait être limité à 8 bits.)
Poignée de porte

n'y a-t-il aucun moyen de cartographier en profondeur avec un pfn?
Ven

1
@ven @Doorknob En fait , vous pouvez le faire: .w-LLL255'z\a. Mais ne me demandez pas comment cela fonctionne ou pourquoi vous avez besoin LLLet pas quelque chose comme ça LMM.
Jakube

18

MATL , 10 octets

255iYi-IYG

Il existe cinq sous - formats différents de PNG, selon la façon dont la couleur est codée. Aucun d'eux ne semble plus "facultatif" que les autres. J'ai choisi le plus flexible Truecolor, dans lequel chaque pixel peut avoir une couleur arbitraire. Le code ci-dessus prend également en charge Truecolor with alpha, en ignorant le canal alpha.

Pour connaître le sous-format de couleur d'un fichier PNG: recherchez la séquence d'octets [73 72 68 82]près du début du fichier; et le dixième octet à partir de là aura l'une des cinq valeurs du tableau lié ci-dessus .

Comment fonctionne le code

Assez simple:

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

Exemple

Je n'ai pas pu résister à me voir inversé, j'ai donc téléchargé cette image (qui est en sous-format Truecolor with alpha), j'ai exécuté le code (la deuxième ligne est entrée par l'utilisateur)

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

et j'ai

entrez la description de l'image ici


1
Votre avatar est en fait vous? Je pensais que c'était juste ton casque! : P
Downgoat

1
Je pensais que PNG et tout signifie du code long, mais 10 octets? Sensationnel.
Mémoire tampon

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
J'aime la façon dont x-- et x> 0 forment ensemble une petite flèche indiquant que x monte à 0. Pourquoi n'ai-je jamais vu / utilisé cela auparavant?
LuWi

Importer java.io.File?
nickb

1
@LuWi hehe, je l'ai déjà vu et utilisé, certaines personnes l' appellent l'opérateur "va à", et c'est assez golfique :)
aditsu

@nickb même si vous utilisez le plus court import java.io.*; , il n'enregistre aucun octet mais augmente en fait la taille.
aditsu

4

R, 124 octets

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()

Lit le nom du fichier via stdin ( readline()).

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.

Exemple d'entrée / sortie utilisant le premier png que j'ai trouvé sur cet ordinateur :)

Contribution Production



2

Tcl, 176 octets

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

Charge le PNG via le photo type d'image, obtient les données d'image, convertit chaque ligne et couleur en soustrayant de #FFFFFF, puis réécrit le fichier sur le disque (sous la forme "a.png").

Pour de meilleurs résultats, utilisez des PNG TrueColor, car Tk essaiera d'utiliser la même résolution de couleur que les données d'image source.

Pour voir l'image sans problèmes d'échantillonnage, ajoutez

pack [label .i -image image1]

jusqu'à la fin. (Évidemment, c'est plus long que l'option de sauvegarde sur disque.)


Vous pouvez utiliser des octets remplaçant foreachparlmap
sergiol

2

Mathematica, 140 octets

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

Notez que vous pouvez enregistrer deux octets en changeant Import[#]pour Import@#et même pour ColorCombine[Most@#].
numbermaniac

Pourquoi un simple ne serait-il pas une ColorNegate@*Importréponse complète?
LegionMammal978


2

Julia, 94 79 octets

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

Il s'agit d'un programme complet qui prend un nom de fichier comme argument de ligne de commande et écrase le fichier donné avec l'image inversée. Il nécessite que le package FileIOet Imagesoient installés. Ce dernier n'a cependant pas besoin d'être importé.

Appelez le programme à partir de la ligne de commande comme julia filename.jl /path/to/image.png .

Non golfé:

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)

Exemple:

ordinaire inversé


1
La pie (?) A l'air sérieusement déprimée sur la deuxième image.
Bálint

1

Python + PIL, 85 octets

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

Cela définit une fonction anonyme qui prend un nom de fichier sous forme de chaîne et enregistre l'image résultante dans a.png.

Essai:

lama lama dehors


1
-3 octets from PIL import Image as IImageI
:,

Je suis assez sûr que cela fonctionnera tout simplement import Image, en rasant une charge entière d'octets
Beta Decay

économiser 11 octets avecfrom PIL.Image import*
Aaron

Je pense que cela inverse aussi accidentellement le canal alpha. Apparemment, la evalfonction fonctionne contre toutes les "bandes", y compris l'alpha. Voici ce que j'obtiens en inversant le logo Firefox - imgur.com/a/wV3MSQX
dana

1
@dana Selon le commentaire de l'OP , la prise en charge des canaux alpha est facultative.
Mego

1

C + stb_image + stb_image_write, 175 162 octets (ou + 72 =247 234)

Ma première soumission sur ce site.

#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);}

Pourrait probablement raser quelques octets. Nécessite la stb_*mise en œuvre soit dans une bibliothèque distincte, soit au début de ce fichier avec:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Je ne l'ai pas inclus dans le décompte car il fait essentiellement partie de la bibliothèque (surtout s'il est compilé séparément). +72 octets pour ajouter cela si nécessaire, cependant.


Mise à jour 1:

Réalisé que seule une fonction (par opposition à un programme entier) est acceptable, rasant 15 octets. L' ancienne implémentation (qui est un programme entier), pour référence:

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 octets

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 octets

Code:

imshow(imcomplement(imread(x)))

Exemple:

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

entrez la description de l'image ici              entrez la description de l'image ici

Explication:

Lisez l'image, à xpartir d'un fichier graphique, complétez l'image, puis affichez l'image.


Le code suppose que xc'est prédéfini, ce qui n'est pas autorisé. Vous pouvez le transformer en une fonction lambda pour +4 octets avec @(x).
Mego

0

FFmpeg, 10 octets

Edit: S'inspirant de la réponse de @ Sparr

-vf negate

(ce qui précède lorsqu'il est passé à ffplay avec le nom de l'image, affichera l'image annulée)


ffplay %1 -vf negate

Ce qui précède est enregistré en tant que fichier de commandes.


1
FFmpeg est-il un langage de programmation selon nos normes? Je n'en sais pas assez pour en être sûr. Peut-être demander sur méta?
Mego

0

Raquette 282 octets

(λ(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))

Forme plus lisible:

(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))

Usage:

(f "myimg.png")

0

Golang, 311 octets

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)}

non golfé

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 octets

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

La bibliothèque OpenCV utilise des tableaux NumPy pour lire, traiter et écrire des images. Voici un exemple de ce script inversant une image trouvée sur mozilla.org .

Oeuvre de bord inversée

Tous les canaux, y compris le canal alpha, seront inversés. Cela pose problème pour les images transparentes. Mais comme @Mego l'a souligné, la prise en charge du canal alpha est facultative.

Voici une version commentée de 82 octets dont la propriété gère le canal alpha.

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

Comme indiqué ci-dessous, cela gère correctement l'inversion du logo Firefox tout en préservant l'arrière-plan transparent.

Logo Firefox inversé

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.