Inverter imagem png


15

Crie um programa ou função que tome o nome do arquivo como argumento ou o leia da entrada padrão e conclua a seguinte tarefa:

  1. Leia a imagem de um arquivo png (nome dado como argumento).
  2. Inverta as cores nessa imagem, de modo que, por exemplo, o verde escuro (0, 75, 30) se torne (255, 180, 225) (porque 255-0 = 255, 255-75 = 180 e 255-30 = 225). Você não deve alterar o valor do canal alfa.
  3. Envie essa imagem para um arquivo chamado a.png(em formato png) ou mostre-a na janela da GUI.

Isso é . Aplicam-se brechas padrão.


É necessário oferecer suporte a recursos png opcionais? As funções internas de carregamento / gravação de png são aceitáveis?
Sparr 28/03

@Sparr O suporte opcional a recursos é opcional . As funções internas não são explicitamente proibidas, portanto, assumirei que elas são permitidas.
Hannes Karppila 28/03

5
Os arquivos PNG podem ser indexados (cada pixel contém um ponteiro para uma cor no mapa de cores) ou TrueColor (cada pixel contém a cor real). Qual deles precisamos apoiar? Podemos escolher? De fato, existem cinco subformatos diferentes em relação à cor. Então... ?
Luis Mendo

@ DonMuesli Acho que qualquer método que forneça o resultado correto será bom. Você pode assumir que a cor não está na escala de cinza e o suporte ao canal alfa é opcional. Eu acho que usar qualquer outro modo é aceitável, desde que a tarefa ainda esteja invertendo as cores, e as cores tenham valores (r, g, b).
Hannes Karppila 29/03

1
Posso usar apenas CSS?
Rizze 8/09/16

Respostas:


30

ImageMagick display -fx, 3 7 18 24 bytes

1-u

A ferramenta ImageMagick displaycom o fxparâmetro pode aplicar o programa acima a um png fornecido como parâmetro e exibir os resultados na tela.

Confira meu post na meta sobre o ImageMagick como uma linguagem de programação. Eu escrevi um testador principal por lá como prova de conceito.

A contagem de bytes display -fx code filenameé equivalente a perl -e code filename, onde tradicionalmente contamos apenas codepara o comprimento.


Isso não é uma brecha padrão? Ele recebeu muitos votos positivos, mas parece que deveria ser. Eu acho que se o Mathematica pode ter um monte dessas funções integradas, usar qualquer aplicativo pré-lançado (antes da pergunta) para fazer isso por você é um jogo justo, desde que aceite argumentos da linha de comando?
Nate Diamond

1
@NateDiamond me dar cerca de 5 minutos para terminar o meu post meta sobre "é imagemagick uma linguagem de programação" e eu vou cortar esse baixo para 7 bytes e abordar a sua pergunta, ao mesmo tempo :)
Sparr


21

Pitão, 16 15 13 bytes

.w-LLL255'z\a

Saídas para 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

Obrigado a Jakube por 2 bytes!


4
homem, eu tenho que aprender pyth
undergroundmonorail

1
Pyth não tem negação bit a bit ( ~ou similar)?
Peter Taylor

@ PeterTaylor Acho que não, surpreendentemente. (Em qualquer caso, ele teria que ser restrito a 8 bits.)
Doorknob

não há como mapear profundamente com um pfn?
Ven

1
@ven @Doorknob Na verdade, você pode fazê-lo: .w-LLL255'z\a. Mas não me pergunte como isso funciona ou por que você precisa LLLe não algo parecido LMM.
Jakube 29/03

18

MATL , 10 bytes

255iYi-IYG

Existem cinco subformatos diferentes de PNG, dependendo de como a cor é codificada. Nenhum deles parece ser mais "opcional" que os outros. Eu escolhi o mais flexível Truecolor, no qual cada pixel pode ter uma cor arbitrária. O código acima também suporta Truecolor with alpha, ignorando o canal alfa.

Para conhecer o subformato de cor de um arquivo PNG: procure a sequência de bytes [73 72 68 82]perto do início do arquivo; e o décimo byte a partir daí terá um dos cinco valores na tabela vinculada acima .

Como o código funciona

Bem direto:

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

Exemplo

Não pude resistir a me ver invertido, então baixei esta imagem (que está em subformato Truecolor with alpha), corri o código (a segunda linha é a entrada do usuário)

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

e pegou

insira a descrição da imagem aqui


1
Seu avatar é você mesmo? Eu pensei que era apenas o seu capacete! : P
Downgoat 29/03/16

1
Eu pensei PNG e todos os meios código longo, mas 10 bytes? Uau.
Buffer Over Leia

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
Eu gosto de como x-- e x> 0 juntos formam uma seta pequena mostrando que x vai até 0. Por que nunca vi / usei isso antes?
LuWi 29/03/16

Importar java.io.File?
nickb

1
@LuWi hehe, eu vi e usado antes, algumas pessoas chamam de "vai para" operador, e é muito Golfy :)
aditsu

@ nickb, mesmo se você usar o menor import java.io.*;, ele não salva bytes, mas na verdade aumenta o tamanho.
Aditsu 29/03/16

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

Lê no nome do arquivo através de 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.

Exemplo de entrada / saída usando o primeiro png que encontrei neste computador :)

Entrada Resultado



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

Carrega o PNG pelo phototipo de imagem, obtém os dados da imagem, convertendo cada linha e cor, subtraindo de #FFFFFF, depois grava o arquivo de volta no disco (como "a.png").

Para obter melhores resultados, use PNGs TrueColor, pois o Tk tentará usar a mesma resolução de cores que os dados da imagem de origem.

Para ver a imagem sem problemas de amostragem, adicione

pack [label .i -image image1]

até o fim. (Obviamente, isso é mais longo que a opção de economia de disco.)


Você pode substituir os bytes foreachporlmap
sergiol 15/02

2

Mathematica, 140 bytes

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

Observe que você pode salvar dois bytes alterando Import[#]para Import@#e o mesmo para ColorCombine[Most@#].
numbermaniac

Por que um simples não ColorNegate@*Importseria uma resposta completa?
usar o seguinte


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

Este é um programa completo que usa um nome de arquivo como argumento de linha de comando e sobrescreve o arquivo fornecido com a imagem invertida. Requer que o pacote FileIOe Imageesteja instalado. O último não precisa ser importado.

Chame o programa na linha de comando como 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)

Exemplo:

regular invertido


1
A pega (?) Parece seriamente deprimida na segunda imagem.
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')

Isso define uma função anônima que pega um nome de arquivo como uma sequência e salva a imagem resultante em a.png .

Execução de teste:

lhama lhama fora


1
-3 bytes:, from PIL import Image as Iseguido pela substituição Imagena função porI
:,

Tenho certeza de que simplesmente import Image vai funcionar, raspar toda uma carga de bytes
Beta Decay

economize 11 bytes com from PIL.Image import*
Aaron

Eu acho que isso acidentalmente inverte o canal alfa também. Aparentemente, a evalfunção funciona contra todas as "bandas", incluindo a alfa. Aqui está o que eu recebo ao inverter o logotipo do Firefox - imgur.com/a/wV3MSQX
dana

1
@dana De acordo com o comentário do OP , o suporte a canais alfa é opcional.
Mego

1

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

Minha primeira submissão neste 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);}

Provavelmente poderia economizar alguns bytes. Precisa de stb_*implementação para estar em uma biblioteca separada ou no início deste arquivo com:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Eu não o incluí na contagem porque é essencialmente parte da biblioteca (especialmente se for compilado separadamente). +72 bytes para adicionar isso, se necessário, no entanto.


Atualização 1:

Percebeu que apenas uma função (em oposição a um programa inteiro) é aceitável, eliminando 15 bytes. A implementação antiga (que é um programa inteiro), para referência:

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 / oitava, 31 bytes

Código:

imshow(imcomplement(imread(x)))

Exemplo:

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

insira a descrição da imagem aqui              insira a descrição da imagem aqui

Explicação:

Leia a imagem, a xpartir de um arquivo gráfico, complemente a imagem e exiba a imagem.


O código assume que xé predefinido, o que não é permitido. Você pode transformá-lo em uma função lambda para +4 bytes com @(x).
Mego

0

FFmpeg, 10 bytes

Edit: Tomando uma sugestão da resposta de @ Sparr

-vf negate

(o texto acima, quando transmitido para ffplay junto com o nome da imagem, exibirá a imagem negada)


ffplay %1 -vf negate

O acima é salvo como um arquivo em lotes.


1
O FFmpeg é uma linguagem de programação para nossos padrões? Não sei o suficiente para ter certeza. Talvez perguntar sobre meta?
Mego

0

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

Forma mais legível:

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

Uso:

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

destroçado

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 bytes

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

A biblioteca OpenCV usa matrizes NumPy para ler, processar e gravar imagens. Abaixo está um exemplo deste script invertendo uma imagem encontrada no mozilla.org .

Arte de borda invertida

Todos os canais, incluindo o canal alfa, serão invertidos. Isso é problemático para imagens com transparência. Mas, como o @Mego apontou, o suporte ao canal alfa é opcional.

Abaixo está uma versão comentada de 82 bytes que a propriedade lida com o canal alfa.

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

Como mostrado abaixo, isso manipula adequadamente a inversão do logotipo do Firefox, preservando o fundo transparente.

Logotipo do Firefox invertido

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.