Png resmi ters çevir


15

Dosya adını bağımsız değişken olarak alan veya standart girdiden okuyan ve aşağıdaki görevi tamamlayan program veya işlev oluşturun:

  1. Resmi bir png dosyasından (bağımsız değişken olarak verilen ad) okuyun.
  2. Bu görüntüdeki renkleri ters çevirin, böylece örneğin koyu yeşil (0, 75, 30) (255, 180, 225) olur (çünkü 255-0 = 255, 255-75 = 180 ve 255-30 = 225). Alfa kanalı değerini değiştirmemelisiniz.
  3. Bu görüntüyü a.png(png formatında) adlı bir dosyaya gönderin veya GUI penceresinde gösterin.

Bu . Standart boşluklar geçerlidir.


Herhangi bir isteğe bağlı png özelliğini desteklemek gerekiyor mu? Yerleşik png yükleme / yazma işlevleri kabul edilebilir mi?
Sparr

@Sparr İsteğe bağlı özellik desteği isteğe bağlıdır . Yerleşik işlevler açıkça izin verilmez, bu yüzden izin verildiğini varsayacağım.
Hannes Karppila

5
PNG dosyaları dizine eklenebilir (her piksel, renk haritasındaki bir renge işaretçi içerir) veya gerçek renk (her piksel gerçek rengi içerir). Hangisini desteklememiz gerekiyor? Seçebilir miyiz? Aslında, renkle ilgili beş farklı alt biçim vardır . Yani... ?
Luis Mendo

@DonMuesli Bence doğru sonuç sağlayan herhangi bir yöntem iyi olacak. Rengin gri tonlamalı olmadığını ve alfa kanalını desteklemenin isteğe bağlı olduğunu varsayabilirsiniz. Görev hala renkleri tersine çevireceği ve renklerin (r, g, b) değerlerine sahip olduğu sürece başka bir mod kullanmanın kabul edilebilir olduğunu düşünüyorum.
Hannes Karppila

1
Yalnızca CSS kullanabilir miyim?
Rizze

Yanıtlar:


30

ImageMagick display -fx, 3 7 18 24 bayt

1-u

ImageMagick aracı displayile fxparametre parametre olarak verilen bir png için yukarıdaki programı uygulamak ve ekranda sonuçlarını görüntüleyebilir.

ImageMagick hakkında meta olarak bir programlama dili olarak yazıma göz atın . Oraya kavram kanıtı olarak bir başbakan yazdım.

Re bayt sayımı, geleneksel olarak sadece uzunluk için saydığımız display -fx code filenameeşdeğerdir .perl -e code filenamecode


Bu standart bir boşluk değil mi? Çok sayıda oy aldı, ancak olması gerektiği gibi görünüyor. Mathematica'nın bu işlevlerin bir demetine sahip olup olmadığını tahmin edip, daha önce yayınlanmış herhangi bir uygulamayı (soruyu sormadan önce) kullanarak sizin için bunu yapmak adil bir oyun, komut satırı argümanlarını kabul ettiği sürece?
Nate Diamond

1
@NateDiamond "Imagemagick bir programlama dili" hakkında meta yayınımı bitirmek için bana yaklaşık 5 dakika verin ve bunu 7 bayta indireceğim ve aynı zamanda sorunuza da cevap vereceğim :)
Sparr


21

Pyth, 16 15 13 bayt

.w-LLL255'z\a

Çıkışları 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

Jakube'a 2 bayt için teşekkürler !


4
dostum, pyth öğrenmem gerekiyor
undergroundmonorail

1
Pyth'in bitsel olumsuzlaması ( ~veya benzeri) yok mu?
Peter Taylor

@PeterTaylor Şaşırtıcı bir şekilde, sanmıyorum. (Her durumda, 8 bit ile sınırlandırılmalıdır.)
Kapı Tokmağı

pfn ile derinlemesine harita yapmanın bir yolu yok mu?
Ven

1
@ven @Doorknob Aslında bunu yapabilirsiniz: .w-LLL255'z\a. Ama bana bunun nasıl çalıştığını ya da neden LLLböyle bir şeye ihtiyaç duymadığını sorma LMM.
Jakube

18

MATL , 10 bayt

255iYi-IYG

Orada beş farklı subformats renk kodlu şekline bağlı PNG. Hiçbiri diğerlerinden daha "isteğe bağlı" görünmüyor. TruecolorHer pikselin keyfi bir renge sahip olabileceği en esnek olanı seçtim . Yukarıdaki kod Truecolor with alpha, alfa kanalını yok sayarak da destekler .

Bir PNG dosyasının renk alt biçimini bilmek için: dosyanın [73 72 68 82]başına yakın bayt dizisini arayın ; ve onuncu bayt, yukarıdaki tablodaki beş değerden birine sahip olacaktır .

Kod nasıl çalışır?

Oldukça basit:

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

Misal

Kendimi ters görünmeye karşı koyamadım, bu yüzden (alt formatta olan ) bu görüntüyü indirdim Truecolor with alpha, kodu çalıştırdı (ikinci satır kullanıcı girişi)

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

ve var

enter image description here


1
Avatarın aslında sen misin? Sadece kaskýn olduđunu sanýyordum! : P
Downgoat

1
Ben PNG düşündüm ve tüm uzun kod anlamına gelir, ama 10 bayt? Vay.
Tampon Üzerine

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
X-- ve x> 0'ın birlikte x'in 0'a kadar çıktığını gösteren bir litte oku yapmayı seviyorum. Neden daha önce hiç görmedim / kullanmadım?
LuWi

İçe aktarılsın java.io.Filemı?
nickb

1
@LuWi hehe, daha önce gördüm ve kullandım, bazı insanlar buna "gider" operatörü diyor ve oldukça golfçü :)
aditsu çıkın çünkü SE EVIL

@nickb, daha kısa kullansanız bile import java.io.*;, bayt tasarrufu yapmaz, ancak aslında boyutu artırır.
aditsu bıraktı çünkü SE EVIL

4

R, 124 bayt

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

Stdin ( readline()) ile dosya adını okur .

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.

Bu bilgisayarda bulduğum ilk png'yi kullanarak örnek Giriş / Çıkış :)

Input Output



2

Tcl, 176 bayt

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

PNG'yi photogörüntü türü aracılığıyla yükler, görüntü verilerini alır, her satırı ve rengi #FFFFFF'den çıkararak dönüştürür, sonra dosyayı diske geri yazar ("a.png" olarak).

En iyi sonuçlar için TrueColor PNG'leri kullanın, çünkü Tk kaynak görüntü verileriyle aynı renk çözünürlüğünü kullanmaya çalışacaktır.

Görüntüyü örnekleme sorunu olmadan görmek için şunu ekleyin:

pack [label .i -image image1]

sonuna kadar. (Açıkçası, bu disk kaydetme seçeneğinden daha uzundur.)


foreachTarafından bayt avelmap
sergiol

2

Mathematica, 140 bayt

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

Eğer değiştirerek iki bayt kurtarabilir Not Import[#]için Import@#ve aynı ColorCombine[Most@#].
numbermaniac 06

Neden basit ColorNegate@*Importbir cevap tam olmasın ?
LegionMammal978


2

Julia, 94 79 bayt

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

Bu, bir dosya adını komut satırı bağımsız değişkeni olarak alan ve verilen dosyanın ters çevrilmiş görüntünün üzerine yazdığı tam bir programdır. FileIOVe Imagepaketinin kurulmasını gerektirir . İkincisinin ithal edilmesi gerekmez.

Programı komut satırından çağırın 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)

Misal:

regular inverted


1
Saksağan (?) İkinci görüntüye ciddi şekilde depresyonda gibi görünüyor.
Bálint

1

Python + PIL, 85 bayt

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

Bu, dosya adını dize olarak alan ve sonuçtaki görüntüyü kaydeden anonim bir işlevi tanımlar a.png.

Test sürüşü:

llama llama out


1
-3 bayt:, from PIL import Image as Iardından ImageişlevdeI
Tim Čas

Basitçe import Imageçalışacağından eminim, tüm bir bayt yükünü tıraş
Beta Decay

11 bayt ile tasarruf edinfrom PIL.Image import*
Aaron

Sanırım bu yanlışlıkla alfa kanalını da tersine çeviriyor. Görünüşe göre evalfonksiyon, alfa dahil tüm "bantlara" karşı çalışır. İşte Firefox logosunu ters çevirirken elde ettiğim şey - imgur.com/a/wV3MSQX
dana

1
@dana OP'nin yorumuna göre , alfa kanallarını desteklemek isteğe bağlıdır.
Mego

1

C + stb_image + stb_image_write, 175 162 bayt (veya + 72 =247 234)

Şimdiye kadar bu siteye yaptığım ilk başvuru.

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

Muhtemelen birkaç bayt tıraş olabilir. İhtiyaç stb_*birine uygulanması ayrı bir kütüphanede olması veya bu dosyanın başında:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

Bu sayıya dahil etmedi çünkü aslında kütüphanenin bir parçası (ayrı ayrı derlenmişse). Ancak gerekirse bunu eklemek için +72 bayt.


Güncelleme 1:

Sadece bir fonksiyonun gerçekleştirilmesi (tüm programın aksine) kabul edilebilir, 15 bayt tıraş olur. Eski başvuru için (bütün bir program) uygulaması:

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 bayt

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 / Oktav, 31 bayt

Kod:

imshow(imcomplement(imread(x)))

Misal:

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

resim açıklamasını buraya girin              resim açıklamasını buraya girin

Açıklama:

Görüntüyü xbir grafik dosyasından okuyun, görüntüyü tamamlayın ve ardından görüntüyü görüntüleyin.


Kod x, önceden tanımlanmış olduğunu varsayar ve buna izin verilmez. +4 bayt ile lambda fonksiyonuna dönüştürebilirsiniz @(x).
Mego

0

FFmpeg, 10 bayt

Düzenleme: @ Sparr'ın cevabından bir ipucu alma

-vf negate

(yukarıdaki görüntü adıyla birlikte ffplay'e geçtiğinde, reddedilen resmi gösterecektir)


ffplay %1 -vf negate

Yukarıdakiler bir toplu iş dosyası olarak kaydedilir.


1
FFmpeg standartlarımıza göre bir programlama dili midir? Emin olmak için yeterince bilgim yok. Belki de meta sormak?
Mego

0

Raket 282 bayt

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

Daha okunabilir 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))

Kullanımı:

(f "myimg.png")

0

Golang, 311 bayt

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 bayt

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

OpenCV kütüphanesi, görüntüleri okumak, işlemek ve yazmak için NumPy dizilerini kullanır. Aşağıda bu komut dosyasının mozilla.org'da bulunan bir resmi ters çeviren bir örneği bulunmaktadır .

Kenar Resmi Ters Çevrilmiş

Alfa kanalı dahil tüm kanallar ters çevrilir. Bu saydamlığı olan görüntüler için sorunludur. Ancak @Mego'nun belirttiği gibi, alfa kanalı desteği isteğe bağlıdır.

Aşağıda, alfa kanalını işleyen 82 baytlık yorumlanmış bir sürüm bulunmaktadır.

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

Aşağıda gösterildiği gibi, saydam arka planı korurken Firefox logosunun ters çevrilmesini düzgün bir şekilde yapar.

Firefox Logosu Ters Çevrildi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.