Balikkan gambar png

15

Buat program atau fungsi yang menggunakan nama file sebagai argumen atau membacanya dari input standar, dan menyelesaikan tugas berikut:

  1. Baca gambar dari file png (nama diberikan sebagai argumen).
  2. Membalikkan warna dalam gambar itu, sehingga misalnya hijau tua (0, 75, 30) akan menjadi (255, 180, 225) (karena 255-0 = 255, 255-75 = 180 dan 255-30 = 225). Anda seharusnya tidak mengubah nilai saluran alpha.
  3. Keluarkan gambar itu ke file yang disebut a.png(dalam format png), atau tampilkan di jendela GUI.

Ini adalah . Celah standar berlaku.

Hannes Karppila
sumber
Apakah diperlukan untuk mendukung fitur png opsional? Apakah fungsi png memuat / menulis built-in dapat diterima?
Sparr
@Sparr Dukungan fitur opsional adalah opsional . Fungsi bawaan tidak dilarang secara eksplisit, jadi saya akan menganggapnya diizinkan.
Hannes Karppila
5
File PNG dapat diindeks (setiap pixel berisi pointer ke warna di colormap) atau truecolor (setiap pixel berisi warna aktual). Yang mana yang perlu kita dukung? Bisakah kita memilih? Bahkan, ada lima subformat berbeda tentang warna. Jadi ...
Luis Mendo
@ DonMuesli Saya pikir setiap metode yang memberikan hasil yang benar akan baik-baik saja. Anda dapat mengasumsikan bahwa warnanya bukan abu-abu, dan mendukung saluran alpha adalah opsional. Saya pikir bahwa menggunakan mode lain dapat diterima, selama tugas masih akan membalikkan warna, dan warna memiliki (r, g, b) -nilai.
Hannes Karppila
1
Bisakah saya menggunakan CSS saja?
Rizze

Jawaban:

30

ImageMagick display -fx, 3 7 18 24 byte

1-u

Alat ImageMagick displaydengan fxparameter dapat menerapkan program di atas ke png yang diberikan sebagai parameter dan menampilkan hasilnya di layar.

Lihat pos saya tentang meta tentang ImageMagick sebagai bahasa pemrograman. Saya menulis tester utama di sana sebagai bukti konsep.

Penghitungan byte ulang, display -fx code filenamesama dengan perl -e code filename, di mana kita menghitung secara tradisional hanya codeuntuk panjang.

Sparr
sumber
Apakah ini bukan celah standar? Sudah banyak upvotes, tapi sepertinya memang begitu. Saya kira jika Mathematica dapat memiliki banyak fungsi-fungsi ini built-in, kemudian menggunakan aplikasi pra-dirilis (sebelum mengajukan pertanyaan) untuk melakukannya untuk Anda adalah permainan yang adil, asalkan ia menerima argumen baris perintah?
Nate Diamond
1
@NateDiamond Beri saya sekitar 5 menit untuk menyelesaikan posting meta saya tentang "adalah imagemagick sebuah bahasa pemrograman" dan saya akan memotong ini menjadi 7 byte dan menjawab pertanyaan Anda pada saat yang sama :)
Sparr
21

Pyth, 16 15 13 byte

.w-LLL255'z\a

Output ke 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

Terima kasih kepada Jakube untuk 2 byte!

Gagang pintu
sumber
4
***, aku harus belajar pyth
undergroundmonorail
1
Apakah Pyth tidak memiliki negasi bitwise ( ~atau serupa)?
Peter Taylor
@PeterTaylor Saya pikir tidak, mengejutkan. (Bagaimanapun, itu harus dibatasi hingga 8 bit.)
Gagang Pintu
Apakah tidak ada cara untuk memetakan secara mendalam dengan pfn?
Ven
1
@ven @Doorknob Sebenarnya Anda bisa melakukannya: .w-LLL255'z\a. Tapi jangan tanya saya bagaimana ini bekerja atau mengapa Anda perlu LLLdan bukan sesuatu seperti itu LMM.
Jakube
18

MATL , 10 byte

255iYi-IYG

Ada lima subformat berbeda PNG yang , tergantung pada bagaimana warna dikodekan. Tak satu pun dari mereka yang tampaknya lebih "opsional" daripada yang lain. Saya memilih yang paling fleksibel Truecolor,, di mana setiap piksel dapat memiliki warna sewenang-wenang. Kode di atas juga mendukung Truecolor with alpha, mengabaikan saluran alpha.

Untuk mengetahui subformat warna dari file PNG: cari urutan byte di [73 72 68 82]dekat awal file; dan byte kesepuluh dari sana akan memiliki satu dari lima nilai dalam tabel yang ditautkan di atas .

Bagaimana kodenya bekerja

Cukup mudah:

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

Contoh

Saya tidak bisa menahan diri untuk tidak melihat diri saya terbalik, jadi saya mengunduh gambar ini (yang ada di dalam subformat Truecolor with alpha), menjalankan kode (baris kedua adalah input pengguna)

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

dan mendapatkan

masukkan deskripsi gambar di sini

Luis Mendo
sumber
1
Avatar Anda sebenarnya adalah Anda? Saya pikir itu hanya helm Anda! : P
Downgoat
1
Saya pikir PNG dan semuanya berarti kode panjang, tetapi 10 byte? Wow.
Buffer Over Read
17

Jawa, 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"));}}
aditsu
sumber
1
Saya suka bagaimana x-- dan x> 0 bersama-sama membuat panah litte yang menunjukkan bahwa x naik ke 0. Mengapa saya tidak pernah melihat / menggunakan itu sebelumnya?
LuWi
Impor java.io.File?
julukan
1
@LuWi hehe, saya pernah melihat dan menggunakannya sebelumnya, beberapa orang menyebutnya operator "pergi ke", dan ini sangat golf :)
aditsu
@nickb bahkan jika Anda menggunakan yang lebih pendek import java.io.*;, itu tidak menyimpan byte tetapi sebenarnya meningkatkan ukuran.
aditsu
4

R, 124 byte

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

Membaca dalam nama file melalui 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.

Contoh Input / Output menggunakan png pertama yang saya temukan di komputer ini :)

Memasukkan Keluaran

plannapus
sumber
2

Tcl, 176 byte

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

Memuat PNG melalui photo tipe gambar, mendapatkan data gambar, mengonversi setiap baris dan warna dengan mengurangi dari #FFFFFF, lalu menulis file kembali ke disk (sebagai "a.png").

Untuk hasil terbaik, gunakan TrueColor PNGs, karena Tk akan mencoba menggunakan resolusi warna yang sama dengan data gambar sumber.

Untuk melihat gambar tanpa masalah pengambilan sampel, tambahkan

pack [label .i -image image1]

sampai akhir. (Jelas, ini lebih panjang dari opsi penyimpanan disk.)

Dúthomhas
sumber
Anda dapat mengganti byte foreachdenganlmap
sergiol
2

Mathematica, 140 byte

Export["a.png",SetAlphaChannel[ColorCombine[Most@#],Last@#]&@MapAt[Image[1-ImageData@#]&,ColorSeparate[Import[#],{"R","G","B","A"}],{;;3}]]&
Jason B.
sumber
Perhatikan bahwa Anda dapat menyimpan dua byte dengan mengubah Import[#]ke Import@#, dan sama untuk ColorCombine[Most@#].
numbermaniac
Mengapa ColorNegate@*Importjawaban sederhana tidak menjadi jawaban yang lengkap?
LegionMammal978
2

cmd + IrfanView, 19 karakter

i_view32 %1 /invert

Hanya alternatif mahal dari Sparr 's jawaban .

manatwork
sumber
2

Julia, 94 79 byte

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

Ini adalah program lengkap yang menggunakan nama file sebagai argumen baris perintah dan menimpa file yang diberikan dengan gambar terbalik. Ini mensyaratkan bahwaFileIO danImage paket diinstal. Yang terakhir tidak perlu diimpor.

Panggil program dari baris perintah seperti julia filename.jl /path/to/image.png .

Tidak Disatukan:

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)

Contoh:

reguler terbalik

Alex A.
sumber
1
Murai (?) Terlihat sangat tertekan pada gambar kedua.
Bálint
1

Python + PIL, 85 byte

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

Ini mendefinisikan fungsi anonim yang mengambil nama file sebagai string dan menyimpan gambar yang dihasilkan a.png .

Uji coba:

llama llama keluar

Mego
sumber
1
-3 byte:, from PIL import Image as Idiikuti dengan mengganti Imagefungsi denganI
Tim Čas
Saya cukup yakin bahwa itu hanya import Imageakan bekerja, mengurangi seluruh byte
Beta Decay
simpan 11 byte denganfrom PIL.Image import*
Aaron
Saya pikir ini secara tidak sengaja membalik saluran alpha juga. Rupanya evalfungsi berjalan melawan semua "band", termasuk yang alpha. Inilah yang saya dapatkan ketika membalik logo Firefox - imgur.com/a/wV3MSQX
dana
1
@dana Menurut komentar OP , mendukung saluran alfa adalah opsional.
Mego
1

C + stb_image + stb_image_write, 175 162 byte (atau + 72 =247 234)

Kiriman pertama saya di situs ini.

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

Mungkin bisa mengurangi beberapa byte. Perlu stb_*implementasi baik di perpustakaan terpisah, atau di awal file ini dengan:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Saya tidak memasukkannya ke dalam penghitungan karena pada dasarnya ini adalah bagian dari perpustakaan (khususnya jika dikompilasi secara terpisah). +72 byte untuk menambahkan itu jika diperlukan.


Pembaruan 1:

Hanya menyadari fungsi (yang bertentangan dengan seluruh program) yang dapat diterima, memotong 15 byte. The tua pelaksanaan (yang merupakan program seluruh), untuk referensi:

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);}
Timas
sumber
1

Java, 300 298 byte

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));}
Shaun Wild
sumber
1

MATLAB / Oktaf, 31 byte

Kode:

imshow(imcomplement(imread(x)))

Contoh:

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

masukkan deskripsi gambar di sini              masukkan deskripsi gambar di sini

Penjelasan:

Baca gambar,, xdari file grafik, lengkapi gambar, dan kemudian tampilkan gambar.

Grant Miller
sumber
Kode ini menganggap bahwa xsudah ditentukan sebelumnya, yang tidak diizinkan. Anda dapat mengubahnya menjadi fungsi lambda untuk +4 byte @(x).
Mego
0

FFmpeg, 10 byte

Sunting: Mengambil petunjuk dari jawaban @ Sparr

-vf negate

(di atas bila dilewatkan untuk bermain bersama dengan nama gambar, akan menampilkan gambar yang dinegasikan)


ffplay %1 -vf negate

Di atas disimpan sebagai file batch.

Gyan
sumber
1
Apakah FFmpeg adalah bahasa pemrograman menurut standar kami? Saya tidak cukup tahu tentang hal itu untuk memastikan. Mungkin bertanya pada meta?
Mego
0

Racket 282 byte

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

Bentuk yang lebih mudah dibaca:

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

Pemakaian:

(f "myimg.png")
juga
sumber
0

Golang, 311 byte

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)
}
cia_rana
sumber
0

Python 2 + OpenCV , 55 byte

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

Pustaka OpenCV menggunakan array NumPy untuk membaca, memproses, dan menulis gambar. Di bawah ini adalah contoh dari skrip ini membalik gambar yang ditemukan di mozilla.org .

Karya Seni Tepi Terbalik

Semua saluran, termasuk saluran alfa, akan terbalik. Ini bermasalah untuk gambar yang memiliki transparansi. Tetapi seperti yang ditunjukkan @Mego, dukungan untuk saluran alpha adalah opsional.

Di bawah ini adalah versi berkomentar 82 byte yang properti menangani saluran 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

Seperti ditunjukkan di bawah, ini dengan benar menangani pembalik logo Firefox sambil mempertahankan latar belakang transparan.

Logo Firefox Terbalik

dana
sumber