PNG 이미지 반전


15

파일 이름을 인수로 사용하거나 표준 입력에서 읽은 프로그램 또는 함수를 작성하고 다음 태스크를 완료하십시오.

  1. png 파일에서 이미지를 읽습니다 (이름은 인수로 제공됨).
  2. 예를 들어 짙은 녹색 (0, 75, 30)이 (255-0 = 255, 255-75 = 180 및 255-30 = 225이기 때문에) 예를 들어 짙은 녹색 (0, 75, 30)이되도록 해당 이미지의 색상을 반전시킵니다. 알파 채널 값을 변경해서는 안됩니다.
  3. 해당 이미지를 a.png(png 형식) 이라는 파일로 출력 하거나 GUI 창에 표시하십시오.

이것은 입니다. 표준 허점이 적용됩니다.


선택적인 png 기능을 지원해야합니까? 내장 된 png 로딩 / 쓰기 기능이 허용됩니까?
Sparr

@Sparr 선택적 기능 지원은 선택적 입니다. 내장 함수는 명시 적으로 허용되지 않으므로 허용되는 것으로 가정합니다.
Hannes Karppila

5
PNG 파일은 색인화 (각 픽셀에는 컬러 맵의 색상에 대한 포인터가 포함되어 있음) 또는 트루 컬러 (각 픽셀에는 실제 색상이 포함됨)가 있습니다. 우리는 어느 것을 지원해야합니까? 우리는 선택할 수 있습니까? 실제로 색상과 관련하여 5 가지 하위 형식이 있습니다. 그래서 ...?
Luis Mendo

@ DonMuesli 올바른 결과를 제공하는 모든 방법이 좋을 것이라고 생각합니다. 색상이 그레이 스케일이 아니며 알파 채널 지원은 선택 사항이라고 가정 할 수 있습니다. 작업이 여전히 색상을 반전시키고 색상에 (r, g, b) 값이있는 한 다른 모드를 사용하는 것이 가능하다고 생각합니다.
Hannes Karppila

1
CSS 만 사용할 수 있습니까?
Rizze

답변:


30

ImageMagick display -fx, 3 7 18 24 바이트

1-u

매개 변수가 있는 ImageMagick 도구 displayfx매개 변수로 제공된 png에 위의 프로그램을 적용하고 결과를 화면에 표시 할 수 있습니다.

프로그래밍 언어로 ImageMagick 에 대한 메타 에 대한 내 게시물을 확인하십시오 . 나는 개념 증명으로 저기 주요 테스터를 썼습니다.

Re byte counting은와 display -fx code filename동일합니다 perl -e code filename. 여기서 우리는 전통적 code으로 길이만을 계산 합니다.


이것이 표준 허점이 아닌가? 많은 찬사를 받았지만 꼭 그래야 할 것 같습니다. Mathematica에 이러한 기능이 내장되어 있다면 사전 출시 된 응용 프로그램 (질문을 묻기 전에)을 사용하여 명령 줄 인수를 허용하는 한 공정한 게임이라고 생각하십니까?
네이트 다이아몬드

1
@NateDiamond "imagemagick는 프로그래밍 언어입니다"라는 메타 게시물을 완성하는 데 약 5 분이 소요됩니다.이를 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

2 바이트의 Jakube 에 감사 합니다!


4
남자, 나는 pyth를 배워야 해요
undergroundmonorail

1
Pyth에는 비트 단위 부정 ( ~또는 이와 유사한)이 없습니까?
피터 테일러

@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]의 시작 부분 근처에서 바이트 시퀀스를 찾으십시오 . 그리고 열 번째거기 바이트는 위에 링크 된 테이블에 5 개의 값 중 하나를 갖습니다 .

코드 작동 방식

꽤 직설적 인:

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

나는 자신이 거꾸로 된 것을 볼 수 없었기 때문에이 이미지 (서브 형식 Truecolor with alpha) 를 다운로드 하고 코드를 실행했습니다 (두 번째 줄은 사용자 입력)

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

그리고 얻었다

enter image description here


1
당신의 아바타는 실제로 당신입니까? 나는 그것이 당신의 헬멧이라고 생각했습니다! : P
Downgoat

1
나는 PNG와 긴 코드를 의미한다고 생각하지만 10 바이트입니까? 와.
버퍼 오버 읽기

17

자바, 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이 함께 x가 0까지 올라가는 것을 나타내는 작은 화살표를 만드는 방법이 마음에 듭니다.
LuWi

수입 java.io.File?
nickb

1
@LuWi hehe, 전에 보았고 사용했습니다. 어떤 사람들 은 그것을 "가는"연산자라고 부르며 꽤 골프입니다 :)
aditsu

@nickb는 shorter를 사용하더라도 import java.io.*;바이트를 저장하지 않지만 실제로는 크기를 증가시킵니다.
aditsu

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를 사용한 입력 / 출력 예 :)

입력 산출



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

photo이미지 유형을 통해 PNG를로드하고 이미지 데이터를 가져 와서 #FFFFFF에서 빼서 각 행과 색상을 변환 한 다음 파일을 디스크에 다시 씁니다 ( "a.png").

최상의 결과를 얻으려면 Tk에서 소스 이미지 데이터와 동일한 색상 해상도를 사용하려고하므로 TrueColor PNG를 사용하십시오.

샘플링 문제없이 이미지를 보려면

pack [label .i -image image1]

끝까지. (이것은 디스크 저장 옵션보다 깁니다.)


당신은 대체 바이트 집결지 수 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[#]하여 2 바이트를 절약 할 수 있습니다 . Import@#ColorCombine[Most@#]
numbermaniac

왜 간단한 ColorNegate@*Import것이 완전한 대답이 아닐까요?
LegionMammal978


2

줄리아, 94 79 바이트

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

이것은 파일 이름을 명령 줄 인수로 사용하고 주어진 파일을 반전 된 이미지로 덮어 쓰는 전체 프로그램입니다. 그것은 필요로 그 FileIOImage 패키지가 설치 될 수있다. 후자는 가져올 필요가 없습니다.

다음과 같이 명령 행에서 프로그램을 호출하십시오. julia filename.jl /path/to/image.png .

언 골프 드 :

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

파이썬 + PIL, 85 바이트

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

파일 이름을 문자열로 사용하여 결과 이미지를에 저장하는 익명 함수를 정의합니다 a.png.

시운전 :

야마 라마 아웃


1
-3 bytes : from PIL import Image as I, 그 다음에 Image함수로 교체I
Tim Čas

나는 단순히 import Image바이트의 전체 부하를
Beta Decay

11 바이트를 저장from PIL.Image import*
아론

나는 이것이 우연히 알파 채널을 뒤집는 것이라고 생각합니다. 분명히 eval함수는 알파를 포함하여 모든 "대역"에 대해 실행됩니다. 다음은 Firefox 로고를 뒤집을
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

자바, 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 / 옥타브, 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는 표준에 따라 프로그래밍 언어입니까? 나는 그것에 대해 확실하지 않습니다. 아마도 메타를 물어 볼까요?
메고

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

골랑, 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)}

언 골프

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

파이썬 2 + OpenCV , 55 바이트

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

OpenCV 라이브러리는 NumPy 배열을 사용하여 이미지를 읽고 처리하고 씁니다. 다음은 mozilla.org 에있는 이미지를 반전시키는이 스크립트의 예입니다 .

엣지 아트 워크 반전

알파 채널을 포함한 모든 채널이 반전됩니다. 투명도가있는 이미지에는 문제가됩니다. 그러나 @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.