สลับรูปภาพ png


15

สร้างโปรแกรมหรือฟังก์ชั่นที่ใช้ชื่อไฟล์เป็นอาร์กิวเมนต์หรืออ่านจากอินพุตมาตรฐานและทำงานต่อไปนี้ให้สมบูรณ์:

  1. อ่านภาพจากไฟล์ png (ชื่อที่กำหนดเป็นอาร์กิวเมนต์)
  2. เปลี่ยนสีในภาพนั้นตัวอย่างเช่นสีเขียวเข้ม (0, 75, 30) จะกลายเป็น (255, 180, 225) (เพราะ 255-0 = 255, 255-75 = 180 และ 255-30 = 225) คุณไม่ควรเปลี่ยนค่าช่องอัลฟ่า
  3. เอาต์พุตอิมเมจนั้นไปยังไฟล์ที่เรียกว่าa.png(ในรูปแบบ png) หรือแสดงในหน้าต่าง GUI

นี่คือรหัสกอล์ฟช่องโหว่มาตรฐานใช้


จำเป็นต้องมีฟีเจอร์ png ที่เป็นตัวเลือกหรือไม่? ฟังก์ชั่นการโหลด / เขียน png ในตัวยอมรับได้หรือไม่?
Sparr

สนับสนุนคุณลักษณะ @Sparr ตัวเลือกเป็นตัวเลือก ฟังก์ชั่นในตัวไม่ได้รับอนุญาตอย่างชัดเจนดังนั้นฉันจะถือว่าพวกเขาได้รับอนุญาต
Hannes Karppila

5
ไฟล์ PNG สามารถทำดัชนีได้ (แต่ละพิกเซลมีตัวชี้ไปยังสีในตารางสี) หรือ truecolor (แต่ละพิกเซลมีสีจริง) เราต้องการสนับสนุนอันไหน เราเลือกได้ไหม ในความเป็นจริงมีห้ารูปแบบย่อยที่แตกต่างกันเกี่ยวกับสี ดังนั้น ...
Luis Mendo

@ DonMuesli ฉันคิดว่าวิธีการใดที่ให้ผลลัพธ์ที่ถูกต้องจะไม่เป็นไร คุณสามารถสันนิษฐานได้ว่าสีนั้นไม่ใช่เฉดสีเทาและรองรับ alpha-channel เป็นทางเลือก ฉันคิดว่าการใช้โหมดอื่นเป็นที่ยอมรับตราบใดที่งานยังคงกลับสีและสีมี (r, g, b) - ค่า
Hannes Karppila

1
ฉันจะใช้ CSS ได้ไหม?
Rizze

คำตอบ:


30

ImageMagick display -fx, 3 7 18 24ไบต์

1-u

เครื่องมือ ImageMagick displayพร้อมfxพารามิเตอร์สามารถใช้โปรแกรมด้านบนกับ png ที่กำหนดเป็นพารามิเตอร์และแสดงผลลัพธ์บนหน้าจอ

ลองอ่านโพสต์ของฉันในเมตาเกี่ยวกับ ImageMagick เป็นภาษาโปรแกรม ฉันเขียนผู้ทดสอบหลักไว้ที่นั่นเพื่อพิสูจน์แนวคิด

การนับไบต์ซ้ำdisplay -fx code filenameนั้นเทียบเท่ากับperl -e code filenameที่เรานับcodeความยาวแบบดั้งเดิม


นี่ไม่ใช่ช่องโหว่มาตรฐานใช่หรือไม่ มันได้ upvotes มากมาย แต่ดูเหมือนว่ามันควรจะเป็น ฉันเดาว่า Mathematica สามารถมีฟังก์ชั่นเหล่านี้ในตัวได้หรือไม่แล้วใช้แอปพลิเคชันที่เปิดตัวล่วงหน้า (ก่อนถามคำถาม) เพื่อทำเพื่อคุณเกมที่ยุติธรรมตราบใดที่ยอมรับอาร์กิวเมนต์บรรทัดคำสั่ง?
Nate Diamond

1
@NateDiamond ให้ฉันประมาณ 5 นาทีเพื่อเสร็จสิ้นการโพสต์เมตาของฉันเกี่ยวกับ "เป็น ImageMagick ภาษาโปรแกรม" และฉันจะลดลงนี้ถึง 7 ไบต์และตอบคำถามของคุณในเวลาเดียวกัน :)
SPARR


21

Pyth, 16 15 13 ไบต์

.w-LLL255'z\a

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สำหรับ 2 ไบต์!


4
ชายฉันต้องเรียนรู้ pyth
undergroundmonorail

1
Pyth ไม่มีการปฏิเสธในระดับบิต ( ~หรือคล้ายกัน)?
Peter Taylor

@ PeterTaylor ฉันไม่คิดว่ามันน่าแปลกใจ (ไม่ว่าในกรณีใดมันจะต้องถูก จำกัด ไว้ที่ 8 บิต)
Doorknob

จะไม่มีแผนที่ลึกกับ pfn ไหม?
Ven

1
@ven @Doorknob .w-LLL255'z\aจริงคุณสามารถทำมันได้ แต่อย่าถามฉันว่างานนี้หรือเหตุผลที่คุณต้องการและไม่ได้สิ่งที่ต้องการLLL LMM
Jakube

18

MATL 10 ไบต์

255iYi-IYG

PNG มีห้ารูปแบบย่อยขึ้นอยู่กับวิธีการเข้ารหัสของสี ดูเหมือนว่าจะไม่มี "ตัวเลือก" มากกว่าคนอื่น ฉันเลือกตัวที่ยืดหยุ่นที่สุดTruecolorซึ่งแต่ละพิกเซลสามารถมีสีได้ตามใจชอบ รหัสข้างต้นยังรองรับTruecolor with alphaโดยไม่สนใจช่องอัลฟา

หากต้องการทราบรูปแบบสีของไฟล์ PNG ให้มองหาลำดับไบต์[73 72 68 82]ใกล้กับจุดเริ่มต้นของไฟล์ และสิบไบต์จากนั้นจะมีหนึ่งในห้าค่าในตารางที่เชื่อมโยงด้านบนตารางที่เชื่อมโยงดังกล่าวข้างต้น

รหัสทำงานอย่างไร

ตรงไปตรงมาสวย:

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

ตัวอย่าง

ฉันไม่สามารถต้านทานการเห็นฤmyselfษีตัวเองดังนั้นฉันดาวน์โหลดภาพนี้ (ซึ่งอยู่ในรูปแบบย่อยTruecolor with alpha) รันโค้ด (บรรทัดที่สองคืออินพุตของผู้ใช้)

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

และได้รับ

enter image description here


1
อวาตาร์ของคุณคือคุณจริงเหรอ? ฉันคิดว่ามันเป็นเพียงหมวกของคุณ! : P
Downgoat

1
ฉันคิดว่า PNG และทั้งหมดหมายถึงรหัสยาว แต่ 10 ไบต์? ว้าว.
Buffer Over อ่าน

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 - และ x> 0 ร่วมกันทำลูกศร litte แสดงว่า x เพิ่มขึ้นเป็น 0 ทำไมฉันไม่เคยเห็น / ใช้มันมาก่อน
LuWi

นำเข้าjava.io.Fileหรือไม่
nickb

1
@LuWi ฮิฮิฉันเคยเห็นและใช้งานมาก่อนบางคนเรียกมันว่า "ไปที่" โอเปอเรเตอร์และมันก็ค่อนข้างกอล์ฟ :)
aditsu ออกเพราะ SE เป็น

@nickb แม้ว่าคุณจะใช้ที่สั้นกว่าimport java.io.*;ก็ไม่ได้บันทึกไบต์ใด ๆ แต่จริง ๆ แล้วเพิ่มขนาด
aditsu เลิกเพราะ SE นั้นชั่วร้าย

4

R, 124 ไบต์

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

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.

ตัวอย่างอินพุต / เอาต์พุตโดยใช้ png แรกที่ฉันพบในคอมพิวเตอร์เครื่องนี้ :)

Input Output



2

Tcl, 176 ไบต์

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 ผ่านทาง photoประเภทรูปภาพรับข้อมูลภาพแปลงแต่ละแถวและสีด้วยการลบออกจาก #FFFFFF จากนั้นเขียนไฟล์กลับไปที่ดิสก์ (เป็น "a.png")

เพื่อผลลัพธ์ที่ดีที่สุดให้ใช้ TrueColor PNGs เนื่องจาก Tk จะพยายามใช้ความละเอียดสีเดียวกับข้อมูลภาพต้นฉบับ

หากต้องการดูภาพโดยไม่มีปัญหาการสุ่มตัวอย่างให้เพิ่ม

pack [label .i -image image1]

ไปยังจุดสิ้นสุด (เห็นได้ชัดว่านี่ยาวกว่าตัวเลือกบันทึกดิสก์)


คุณสามารถ ave bytes แทนที่foreachโดยlmap
sergiol

2

Mathematica, 140 ไบต์

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

โปรดทราบว่าคุณสามารถบันทึกไบต์ที่สองโดยการเปลี่ยนImport[#]ไปและเหมือนกันสำหรับImport@# ColorCombine[Most@#]
numbermaniac

ทำไมColorNegate@*Importคำตอบที่เรียบง่ายไม่ใช่คำตอบที่สมบูรณ์
LegionMammal978


2

Julia, 94 79 ไบต์

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

นี่เป็นโปรแกรมเต็มรูปแบบที่รับชื่อไฟล์เป็นอาร์กิวเมนต์บรรทัดคำสั่งและเขียนทับไฟล์ที่กำหนดด้วยอิมเมจกลับด้าน มันต้องการFileIOและImageให้ติดตั้งบรรจุภัณฑ์ หลังไม่จำเป็นต้องนำเข้าแม้ว่า

เรียกใช้โปรแกรมจากบรรทัดคำสั่งเช่น 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)

ตัวอย่าง:

ปกติ ฤๅษี


1
นกกางเขน (?) ดูหดหู่อย่างจริงจังในภาพที่สอง
Bálint

1

Python + PIL ขนาด 85 ไบต์

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

สิ่งนี้กำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้ชื่อไฟล์เป็นสตริงและบันทึกภาพที่เป็นผลลัพธ์ a.pngนี้กำหนดฟังก์ชั่นที่ไม่ระบุชื่อที่ใช้ชื่อไฟล์เป็นสตริงและบันทึกภาพผลลัพธ์ที่จะ

ทดสอบการทำงาน:

สัตว์สี่เท้าชนิดหนึ่ง ลามะออกไป


1
-3 ไบต์: from PIL import Image as Iตามด้วยการแทนที่Imageในฟังก์ชันด้วยI
Tim Čas

ฉันค่อนข้างแน่ใจว่าimport Imageจะใช้งานได้อย่างราบรื่นลดจำนวนไบต์ทั้งหมด
Beta Decay

บันทึก 11 ไบต์ด้วยfrom PIL.Image import*
Aaron

ฉันคิดว่านี่เป็นการพลิกกลับช่องโดยไม่ได้ตั้งใจเช่นกัน เห็นได้ชัดว่าevalฟังก์ชั่นทำงานกับ "วงดนตรี" ทั้งหมดรวมถึงอัลฟาหนึ่ง นี่คือสิ่งที่ฉันได้รับเมื่อแปลงโลโก้ Firefox - imgur.com/a/wV3MSQX
dana

1
@dana ตามความคิดเห็นของ OP การสนับสนุนช่องอัลฟาเป็นตัวเลือก
Mego

1

C + stb_image + stb_image_write 175 162 ไบต์ (หรือ +72 =247 234)

การส่งครั้งแรกของฉันในเว็บไซต์นี้เคย

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

อาจโกนหนวดออกไปสองสามไบต์ จำเป็นต้องมีstb_*การติดตั้งเพื่อใช้งานในห้องสมุดแยกต่างหากหรือเมื่อเริ่มต้นไฟล์นี้ด้วย:

#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION

ฉันไม่ได้รวมไว้ในการนับเพราะมันเป็นส่วนหนึ่งของห้องสมุด (โดยเฉพาะถ้ามันรวบรวมแยกต่างหาก) +72 ไบต์เพื่อเพิ่มว่าถ้าจำเป็นอย่างไรก็ตาม


อัปเดต 1:

รับฟังก์ชั่นเท่านั้น (ซึ่งตรงข้ามกับโปรแกรมทั้งหมด) นั้นสามารถตัดได้ 15 ไบต์ การใช้งานเก่า (ซึ่งเป็นโปรแกรมทั้งหมด) สำหรับการอ้างอิง:

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 ไบต์

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 ไบต์

รหัส:

imshow(imcomplement(imread(x)))

ตัวอย่าง:

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

ป้อนคำอธิบายรูปภาพที่นี่              ป้อนคำอธิบายรูปภาพที่นี่

คำอธิบาย:

อ่านภาพxจากไฟล์กราฟิกเสริมภาพแล้วแสดงภาพ


รหัสสันนิษฐานว่าxมีการกำหนดไว้ล่วงหน้าซึ่งไม่ได้รับอนุญาต คุณสามารถทำให้มันกลายเป็นฟังก์ชั่นแลมบ์ดาสำหรับ 4 @(x)ไบต์ด้วย
Mego

0

FFmpeg, 10 ไบต์

แก้ไข: รับคิวจากคำตอบของ @ Sparr

-vf negate

(ด้านบนเมื่อส่งผ่านไปยัง ffplay พร้อมกับชื่อภาพจะแสดงภาพที่ถูกทำให้ไร้ผล)


ffplay %1 -vf negate

ข้างต้นจะถูกบันทึกเป็นไฟล์แบทช์


1
FFmpeg เป็นภาษาการเขียนโปรแกรมตามมาตรฐานของเราหรือไม่? ฉันไม่รู้เกี่ยวกับเรื่องนี้มากพอที่จะแน่ใจ บางทีถามเมตา
Mego

0

แร็กเก็ต 282 ไบต์

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

แบบอ่านเพิ่มเติม:

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

การใช้งาน:

(f "myimg.png")

0

Golang, 311 ไบต์

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 ไบต์

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

ไลบรารี OpenCV ใช้อาร์เรย์ NumPy เพื่ออ่านประมวลผลและเขียนรูปภาพ ด้านล่างนี้เป็นตัวอย่างของสคริปต์นี้กลับหัวภาพที่พบบนmozilla.org

Edge Artwork กลับด้าน

ช่องทั้งหมดรวมถึงช่องอัลฟาจะกลับด้าน นี่เป็นปัญหาสำหรับภาพที่มีความโปร่งใส แต่ตามที่ @Mego ชี้ให้เห็นว่าการรองรับช่องอัลฟ่านั้นเป็นตัวเลือก

ด้านล่างนี้เป็นรุ่นที่มีความคิดเห็น 82 ไบต์ซึ่งคุณสมบัตินี้จัดการช่องสัญญาณอัลฟ่า

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

ดังที่แสดงไว้ด้านล่างนี่เป็นการจัดการการย้อนกลับโลโก้ Firefox อย่างเหมาะสมในขณะที่ยังคงพื้นหลังที่โปร่งใส

โลโก้ Firefox คว่ำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.