Odwróć obraz png


15

Utwórz program lub funkcję, która pobiera nazwę pliku jako argument lub odczytuje go ze standardowego wejścia i wykonuje następujące zadanie:

  1. Odczytaj obraz z pliku png (nazwa podana jako argument).
  2. Odwróć kolory na tym obrazie, aby na przykład ciemnozielony (0, 75, 30) stał się (255, 180, 225) (ponieważ 255-0 = 255, 255-75 = 180 i 255-30 = 225). Nie należy zmieniać wartości kanału alfa.
  3. Wyjmij ten obraz do pliku o nazwie a.png(w formacie png) lub pokaż go w oknie GUI.

To jest . Obowiązują standardowe luki.


Czy wymagana jest obsługa opcjonalnych funkcji png? Czy wbudowane funkcje ładowania / pisania png są dopuszczalne?
Sparr

@Sparr Opcjonalne wsparcie funkcji jest opcjonalne . Wbudowane funkcje nie są wyraźnie zabronione, więc założę się, że są dozwolone.
Hannes Karppila

5
Pliki PNG można indeksować (każdy piksel zawiera wskaźnik do koloru na mapie kolorów) lub truecolor (każdy piksel zawiera rzeczywisty kolor). Które musimy wspierać? Czy możemy wybrać? W rzeczywistości istnieje pięć różnych podformatów dotyczących kolorów. Więc... ?
Luis Mendo

@DonMuesli Myślę, że każda metoda, która zapewni poprawny wynik, będzie w porządku. Możesz założyć, że kolor nie jest w skali szarości, a obsługa kanału alfa jest opcjonalna. Myślę, że użycie dowolnego innego trybu jest dopuszczalne, o ile zadaniem będzie nadal odwracanie kolorów, a kolory mają (r, g, b) wartości.
Hannes Karppila

1
Czy mogę używać tylko CSS?
Rizze

Odpowiedzi:


30

ImageMagick display -fx, 3 7 18 24 bajtów

1-u

Narzędzie ImageMagick displayz fxparametrem może zastosować powyższy program do png podanego jako parametr i wyświetlić wyniki na ekranie.

Sprawdź mój post na stronie meta o ImageMagick jako języku programowania. Napisałem tam główny tester jako dowód koncepcji.

Ponowne liczenie bajtów display -fx code filenamejest równoważne z tym perl -e code filename, w którym tradycyjnie liczymy tylko codedługość.


Czy to nie jest standardowa luka? Otrzymało wiele pozytywnych opinii, ale wydaje się, że tak powinno być. Sądzę, że jeśli Mathematica może mieć wbudowane kilka tych funkcji, to użycie jakiejkolwiek wstępnie wydanej aplikacji (przed zadaniem pytania) jest dla ciebie uczciwą grą, o ile akceptuje argumenty wiersza poleceń?
Nate Diamond

1
@NateDiamond Daj mi około 5 minut na dokończenie mojego wpisu na temat meta „wyobrażam sobie język programowania”, a ja zmniejszę to do 7 bajtów i jednocześnie
Sparr


21

Pyth, 16 15 13 bajtów

.w-LLL255'z\a

Wyjścia do 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

Dzięki Jakube za 2 bajty!


4
człowieku, muszę się nauczyć pyth
undergroundmonorail

1
Czy Pyth nie ma bitowej negacji ( ~lub podobnej)?
Peter Taylor

@PeterTaylor Nie sądzę, że tak, zaskakująco. (W każdym razie musiałby być ograniczony do 8 bitów.)
Klamka

czy nie ma sposobu na głębokie mapowanie za pomocą pfn?
Ven

1
@ven @Doorknob Właściwie można to zrobić: .w-LLL255'z\a. Ale nie pytaj mnie, jak to działa lub dlaczego potrzebujesz, LLLa nie coś takiego LMM.
Jakube

18

MATL , 10 bajtów

255iYi-IYG

Istnieje pięć różnych podformatów PNG, w zależności od sposobu kodowania kolorów. Żaden z nich nie wydaje się bardziej „opcjonalny” niż inne. Wybrałem najbardziej elastyczny Truecolor, w którym każdy piksel może mieć dowolny kolor. Powyższy kod obsługuje również Truecolor with alphaignorując kanał alfa.

Aby poznać podformat koloru pliku PNG: poszukaj sekwencji bajtów w [73 72 68 82]pobliżu początku pliku; a dziesiąty bajt stamtąd będzie miał jedną z pięciu wartości w tabeli połączonych powyżej .

Jak działa kod

Całkiem proste:

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

Przykład

Nie mogłem się powstrzymać przed odwróceniem się, więc pobrałem ten obraz (który jest w podformacie Truecolor with alpha), uruchomiłem kod (drugi wiersz to wejście użytkownika)

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

i dostał

enter image description here


1
Twój awatar to tak naprawdę ty? Myślałem, że to tylko twój hełm! : P
Downgoat

1
Myślałem, że PNG i wszystko oznacza długi kod, ale 10 bajtów? Łał.
Bufor

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
Podoba mi się, jak x-- i x> 0 razem tworzą małą strzałkę pokazującą, że x rośnie do 0. Dlaczego nigdy wcześniej tego nie widziałem / nie używałem?
LuWi

Importować java.io.File?
nickb

1
@LuWi hehe, widziałem go i używałem wcześniej, niektórzy nazywają to operatorem „idzie do” i jest dość golfowy :)
aditsu zrezygnowało, ponieważ SE to EVIL

@nickb nawet jeśli używasz krótszego import java.io.*;, nie zapisuje on żadnych bajtów, ale faktycznie zwiększa rozmiar.
Aditsu zakończyło się, ponieważ SE to EVIL

4

R, 124 bajty

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

Wczytuje nazwę pliku poprzez 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.

Przykład wejścia / wyjścia przy użyciu pierwszego png znalezionego na tym komputerze :)

Input Output



2

Tcl, 176 bajtów

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

Ładuje PNG przez photo typ obrazu, pobiera dane obrazu, konwertując każdy wiersz i kolor, odejmując od #FFFFFF, a następnie zapisuje plik z powrotem na dysk (jako „a.png”).

Aby uzyskać najlepsze wyniki, użyj TrueColor PNG, ponieważ Tk spróbuje użyć tej samej rozdzielczości kolorów co dane źródłowe obrazu.

Aby zobaczyć obraz bez problemów z próbkowaniem, dodaj

pack [label .i -image image1]

do końca. (Oczywiście jest to dłuższe niż opcja oszczędzania dysku).


Można ave bajtów zastąpienie foreachprzezlmap
sergiol

2

Mathematica, 140 bajtów

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

Zauważ, że możesz zapisać dwa bajty, zmieniając Import[#]na Import@#i taki sam dla ColorCombine[Most@#].
numbermaniac

Dlaczego prosty nie byłby ColorNegate@*Importkompletną odpowiedzią?
LegionMammal978


2

Julia, 94 79 bajtów

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

Jest to pełny program, który przyjmuje nazwę pliku jako argument wiersza poleceń i zastępuje dany plik odwróconym obrazem. Wymaga zainstalowania pakietu FileIOi Image. Ten ostatni nie musi być jednak importowany.

Wywołaj program z wiersza poleceń, np julia filename.jl /path/to/image.png .

Nie golfowany:

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)

Przykład:

regularny odwrotny


1
Sroka (?) Wygląda poważnie przygnębiona na drugim zdjęciu.
Bálint

1

Python + PIL, 85 bajtów

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

Definiuje to anonimową funkcję, która pobiera nazwę pliku jako ciąg i zapisuje wynikowy obraz a.png .

Testowe uruchomienie:

lama Lama


1
-3 bajty:, from PIL import Image as Ia następnie zastąpienie Imagew funkcjiI
Tim Čas

Jestem całkiem pewien, że po prostu import Imagezadziała, goląc cały ładunek bajtów
Beta Decay

zapisz 11 bajtów za pomocąfrom PIL.Image import*
Aaron

Myślę, że to przypadkowo odwraca również kanał alfa. Najwyraźniej evalfunkcja działa na wszystkich „pasmach”, w tym na alfa. Oto, co otrzymuję, odwracając logo Firefoksa - imgur.com/a/wV3MSQX
dana

1
@dana Według komentarza OP , obsługa kanałów alfa jest opcjonalna.
Mego

1

C + stb_image + stb_image_write, 175 162 bajty (lub + 72 =247 234)

Moje pierwsze zgłoszenie na tej stronie kiedykolwiek.

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

Prawdopodobnie mógł ogolić kilka bajtów. Wymaga stb_*implementacji w oddzielnej bibliotece lub na początku tego pliku z:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Nie uwzględniłem go w liczniku, ponieważ jest to zasadniczo część biblioteki (zwłaszcza jeśli jest skompilowana osobno). Jednak +72 bajty, aby dodać, jeśli jest to wymagane.


Aktualizacja 1:

Zrealizowana tylko funkcja (w przeciwieństwie do całego programu) jest dopuszczalna, goląc 15 bajtów. Stary realizacja (która jest cały program), dla odniesienia:

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 bajtów

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 bajtów

Kod:

imshow(imcomplement(imread(x)))

Przykład:

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

wprowadź opis zdjęcia tutaj              wprowadź opis zdjęcia tutaj

Wyjaśnienie:

Przeczytaj obraz xz pliku graficznego, uzupełnij obraz, a następnie wyświetl obraz.


Kod zakłada, że xjest predefiniowany, co jest niedozwolone. Możesz zmienić go w funkcję lambda dla +4 bajtów za pomocą @(x).
Mego

0

FFmpeg, 10 bajtów

Edycja: pobranie wskazówek z odpowiedzi @ Sparr

-vf negate

(powyższe, przekazane do ffplay wraz z nazwą obrazu, wyświetli negację obrazu)


ffplay %1 -vf negate

Powyższe jest zapisywane jako plik wsadowy.


1
Czy FFmpeg jest językiem programowania według naszych standardów? Nie mam wystarczającej wiedzy na ten temat. Może zapytaj na meta?
Mego

0

Rakieta 282 bajtów

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

Bardziej czytelna forma:

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

Stosowanie:

(f "myimg.png")

0

Golang, 311 bajtów

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

bez golfa

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 bajtów

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

Biblioteka OpenCV używa tablic NumPy do odczytu, przetwarzania i zapisywania obrazów. Poniżej znajduje się przykład tego skryptu odwracającego obraz znaleziony na mozilla.org .

Odwrócona grafika krawędzi

Wszystkie kanały, w tym kanał alfa, zostaną odwrócone. Jest to problematyczne w przypadku obrazów o przezroczystości. Ale jak wskazał @Mego, obsługa kanału alfa jest opcjonalna.

Poniżej znajduje się 82-bajtowa wersja z komentarzem, która obsługuje kanał 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

Jak pokazano poniżej, poprawnie obsługuje odwracanie logo Firefoksa przy jednoczesnym zachowaniu przezroczystego tła.

Odwrócone logo Firefox

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.