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オプション機能のサポートはオプションです。組み込み関数は明示的に禁止されていないため、許可されていると仮定します。
ハンネスカルピーラ

5
PNGファイルには、インデックス(各ピクセルにカラーマップの色へのポインターが含まれる)またはトゥルーカラー(各ピクセルに実際の色が含まれる)をインデックス化できます。どちらをサポートする必要がありますか?選択できますか?実際、色に関しては5つのサブフォーマットがあります。そう... ?
ルイスメンドー

@DonMuesli私は、正しい結果を提供するどんな方法でも問題ないと思います。色はグレースケールではなく、アルファチャネルのサポートはオプションであると想定できます。タスクが色を反転し、色に(r、g、b)値がある限り、他のモードを使用することは許容できると思います。
ハネスカルピーラ

1
CSSだけを使用できますか?
リッツ

回答:


30

ImageMagick display -fx、3 7 18 24バイト

1-u

パラメータdisplay付きのImageMagickツールは、fx上記のプログラムをパラメータとして指定されたpngに適用し、結果を画面に表示できます。

プログラミング言語としてのImageMagick に関するメタに関する私の投稿をチェックしください。概念実証としてあそこにプライムテスターを書いた。

バイトカウントについてdisplay -fx code filenameperl -e code filename、従来と同じcode長さでカウントするに相当します。


これは標準的な抜け穴ではありませんか?それは多くの賛成票を得たが、そうあるべきだと思われる。Mathematicaにこれらの関数をたくさん組み込むことができ、コマンドライン引数を受け入れる限り、プレリリースされたアプリケーションを使用して(質問する前に)あなたのためにそれを行うのは公正なゲームですか?
ネイトダイヤモンド

1
@NateDiamond「is imagemagickはプログラミング言語です」についてのメタ投稿を完了するために約5分を与えてください。これを7バイトに
減らし


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バイトありがとう!


4
男、私はピスを学ばなければならない
地下

1
Pythにはビットごとの否定(~または同様)はありませんか?
ピーターテイラー

@PeterTaylor意外とそうだとは思わない。(いずれの場合も、8ビットに制限する必要があります。)
ドアノブ

pfnで深くマッピングする方法はありませんか?
2016年

1
@ven @Doorknob実際にあなたはそれをすることができます:.w-LLL255'z\a。しかし、どのようにこの作品を私に質問しないか、必要とする理由LLLのようなものをないとLMM
寂部

18

MATL、10バイト

255iYi-IYG

PNGには、色のエンコード方法に応じて、5つの異なるサブフォーマットがあります。それらのどれも他のものより「オプション」ではないようです。最も柔軟なものを選択しました。ここでは、Truecolor各ピクセルが任意の色を持つことができます。上記のコードはTruecolor with alpha、アルファチャネルを無視してもサポートします。

PNGファイルのカラーサブフォーマットを知るに[73 72 68 82]は、ファイルの先頭近くでバイトシーケンスを探します。そしてそこから10番目のバイトには、上記テーブルにある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)をダウンロードし、コードを実行しました(2行目はユーザー入力です)

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

そして得た

enter image description here


1
あなたのアバターは実際あなたですか?私はそれがちょうどあなたのヘルメットだと思った!:P
Downgoat

1
PNGとはすべて長いコードを意味すると思っていましたが、10バイトですか?ワオ。
バッファーオーバーリード

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が一緒になってxが0になることを示す小さな矢印を作成する方法が好きです。
-LuWi

インポートjava.io.File
nickb

1
@LuWi笑、私が見て前にそれを使用しました、一部の人は :)演算子「に行く」、そしてそれはかなりgolfyだそれを呼び出す
aditsu

@nickbは、短い方を使用しても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を使用した入力/出力の例:)

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

photo画像タイプを介してPNGを読み込み、画像データを取得し、#FFFFFFから減算して各行と色を変換してから、ファイルをディスクに書き込みます(「a.png」として)。

Tkはソース画像データと同じ色解像度を使用しようとするため、最良の結果を得るにはTrueColor PNGを使用します。

サンプリングの問題なしに画像を表示するには、追加します

pack [label .i -image image1]

最後まで。(明らかに、これはディスク保存オプションよりも長くなります。)


あなたは交換バイトaveのできるforeachことでlmap
sergiol

2

Mathematica、140バイト

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

あなたが変更することで2つのバイトを保存することができますことを注意Import[#]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])))

これは、コマンドライン引数としてファイル名を取り、反転したイメージで指定されたファイルを上書きする完全なプログラムです。FileIOand Imageパッケージをインストールする必要があります。ただし、後者はインポートする必要はありません。

のようなコマンドラインからプログラムを呼び出し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)

例:

regular inverted


1
カササギ(?)は、2番目の画像でひどく落ち込んで見えます。
バリント

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Čas16年

私はimport Image、バイトの負荷全体を削って、単に機能することをかなり確信しています
ベータ崩壊

で11バイトを節約from PIL.Image import*
アーロン

これにより、アルファチャネルも誤って反転されると思います。どうやら、eval関数は、アルファ1を含むすべての「バンド」に対して実行されます。Firefoxのロゴを反転すると、次のようになります-imgur.com/a/wV3MSQX
dana

1
@dana OPのコメントによると、アルファチャネルのサポートはオプションです。
メゴ

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 /オクターブ、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

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

食べない

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で見つかった画像を反転させるこのスクリプトの例です。

エッジアートワークの反転

アルファチャンネルを含むすべてのチャンネルが反転します。これは、透明度のある画像には問題があります。しかし、@ 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.