倒置png图片


15

创建以文件名作为参数或从标准输入中读取文件名的程序或函数,并完成以下任务:

  1. 从png文件(名称作为参数)中读取图像。
  2. 反转该图像中的颜色,以便例如深绿色(0、75、30)变为(255、180、225)(因为255-0 = 255、255-75 = 180和255-30 = 225)。您不应更改Alpha通道值。
  3. 将该图像输出到一个名为a.png(png格式)的文件,或在GUI窗口中显示。

这是。有标准漏洞。


是否需要支持任何可选的png功能?内置的png加载/写入功能是否可以接受?
Sparr

@Sparr可选功能支持是可选的。内置函数没有明确禁止,因此我假设它们是允许的。
汉尼斯·卡皮拉16'Mar

5
可以为PNG文件建立索引(每个像素包含一个指向颜色表中颜色的指针)或truecolor(每个像素包含实际颜色)。我们需要支持哪一个?我们可以选择吗?实际上,关于颜色有五种不同的子格式。那...
Luis Mendo

@ DonMuesli我认为任何提供正确结果的方法都可以。您可以假定颜色不是灰度,并且支持alpha通道是可选的。我认为使用任何其他模式是可以接受的,只要任务仍将反转颜色,并且颜色具有(r,g,b)值即可。
汉尼斯·卡皮拉16'Mar 29'9

1
我可以只使用CSS吗?
Rizze

Answers:


30

ImageMagick display -fx,3 7 18 24字节

1-u

ImageMagick工具displayfx参数可以将上述程序应用于作为参数指定的png,并在屏幕上显示结果。

看看我在meta上的帖子关于ImageMagick作为编程语言的文章。我在那里写了一个主要的测试器作为概念证明。

重新字节计数display -fx code filename等效于perl -e code filename,我们传统上只code按长度计数。


这不是标准漏洞吗?它得到了很多支持,但似乎应该如此。我猜想Mathematica是否可以内置很多这样的功能,然后使用任何预发布的应用程序(在提出问题之前)为您服务是公平的,只要它接受命令行参数?
Nate Diamond

1
@NateDiamond给我大约5分钟时间来完成关于“ is 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是否没有按位求反(~或类似方法)?
彼得·泰勒

@PeterTaylor我不认为这是令人惊讶的。(无论如何,都必须限制为8位。)
门把手

没有办法用pfn进行深度映射?
2016年

1
@ven @Doorknob实际上您可以做到:.w-LLL255'z\a。但是不要问我这是如何工作的,还是为什么你需要LLL而不是这样的问题LMM
雅库布

18

MATL,10字节

255iYi-IYG

PNG 有五种不同的子格式,具体取决于颜色的编码方式。他们似乎没有一个比其他人更“可选”。我选择了最灵活的,Truecolor其中每个像素可以具有任意颜色。上面的代码还支持Truecolor with alpha,忽略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

我无法抗拒看到自己倒立,所以我下载了此图像(为subformat 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
尼克

1
@LuWi hehe,我以前看过并使用过它,有人称它为“ goes to”运算符,而且它很像高尔夫球:)
aditsu退出是因为SE是邪恶的2016年

@nickb即使您使用short import java.io.*;,它也不会节省任何字节,但实际上会增加大小。
aidtsu退出是因为SE为EVIL,2016年

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 PNG,因为Tk会尝试使用与源图像数据相同的颜色分辨率。

要查看图像而不会出现采样问​​题,请添加

pack [label .i -image image1]

到最后。(显然,这比磁盘保存选项要长。)


您可以foreach通过lmap
sergiol '17

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 '18 / 12/31


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
在第二张图像上,喜((?)看上去很沮丧。
巴林特

1

Python + PIL,85个字节

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

这定义了一个匿名函数,该函数将文件名作为字符串并将结果图像保存到a.png

测试运行:

llama llama out


1
-3个字节:from PIL import Image as I,然后ImageI
TimČas

我相当确定这import Image将完全有效,减少了整个字节的负载
Beta Decay

使用from PIL.Image import*
Aaron

我认为这也会意外地反转alpha通道。显然,该eval功能针对​​所有“频段”(包括alpha频段)运行。这是反转Firefox徽标时得到的信息-imgur.com/a/wV3MSQX
dana

1
@dana根据OP的注释,支持alpha通道是可选的。
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 /八度,31字节

码:

imshow(imcomplement(imread(x)))

例:

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

enter image description here              enter image description here

说明:

x从图形文件中读取图像,对图像进行补充,然后显示图像。


该代码假定x是预定义的,这是不允许的。您可以使用将其转换为+4个字节的lambda函数@(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)}

不打高尔夫球

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 Inverted

所有通道,包括Alpha通道,将被反转。这对于具有透明性的图像是有问题的。但正如@Mego指出的那样,对Alpha通道的支持是可选的。

下面是一个82字节带注释的版本,该属性可处理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

如下所示,这可以正确处理Firefox徽标反转的同时保留透明背景。

Firefox Logo Inverted

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.