Інвертувати 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 можуть бути індексовані (кожен піксель містить вказівник на колір у кольоровій карті) або truecolor (кожен піксель містить фактичний колір). Якого нам потрібно підтримати? Чи можемо ми вибрати? Насправді існує п'ять різних підформатів щодо кольору. Так... ?
Луїс Мендо

@DonMuesli Я думаю, що будь-який метод, що забезпечує правильний результат, буде добре. Можна припустити, що колір не має відтінків сірого, і підтримувати альфа-канал необов’язково. Я думаю, що використання будь-якого іншого режиму є прийнятним, доки завдання все одно буде реверсувати кольори, а кольори мають (r, g, b) -значення.
Ганнес Карппіла

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за довжиною.


Це не стандартна лазівка? Отримано багато оновлень, але, схоже, так і має бути. Я думаю, якщо Mathematica може мати вбудовану купу цих функцій, то використовуючи будь-який попередньо випущений додаток (перед тим, як задавати питання) це зробити для вас, це чесна гра, доки вона приймає аргументи командного рядка?
Нейт Діамант

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

Дякую Якубе за 2 байти!


4
людина, я повинен навчитися pyth
undergroundmonorail

1
Чи не має Pyth побітове заперечення ( ~або подібне)?
Пітер Тейлор

@PeterTaylor Я не думаю, що це так дивно. (У будь-якому випадку, його потрібно було б обмежити до 8 біт.)
Дверна ручка

хіба немає можливості глибоко відобразити карту за допомогою pfn?
Вен

1
@ven @Doorknob На насправді ви можете зробити це: .w-LLL255'z\a. Але не питайте мене, як це працює чи навіщо вам потрібно, LLLа не щось подібне LMM.
Якубе

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

Приклад

Я не міг протистояти, коли я перевернувся, тому я завантажив це зображення (яке знаходиться в підформаті Truecolor with alpha), запустив код (другий рядок - це введення користувача)

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

і отримав

enter image description here


1
Ваш аватар насправді ти? Я думав, що це твій шолом! : P
Пуховик

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 разом роблять стрілку, що показує, що х піднімається до 0. Чому я ніколи цього не бачив / не використовував?
LuWi

Імпорт java.io.File?
нік

1
@LuWi хе-хе, я бачив і використовував його раніше, деякі люди називають це оператором "йде", і він досить голий :)
aditsu кинь, тому що SE

@nickb навіть якщо ви використовуєте коротший import java.io.*;, він не економить жодних байтів, але фактично збільшує розмір.
aditsu кинути, тому що SE - EVIL

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").

Для найкращих результатів використовуйте PNG TrueColor, оскільки Tk намагатиметься використовувати те саме кольорове дозвіл, що і вихідні зображення.

Щоб переглянути зображення без проблем з вибіркою, додайте

pack [label .i -image image1]

до кінця. (Очевидно, це довше, ніж опція збереження диска.)


Ви можете ін байт замінити foreachнаlmap
sergiol

2

Математика, 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

Юлія, 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 .

Безголівки:

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подальшим заміщенням Imageу функції наI
Тім Час

Я досить впевнений, що просто import Imageспрацює, обтрусивши цілий набір байтів
Beta Decay

зберегти 11 байт за допомогоюfrom PIL.Image import*
Аарон

Я думаю, що це випадково інвертує також альфа-канал. Мабуть, evalфункція працює проти всіх "діапазонів", включаючи альфа. Ось що я отримую при перевертанні логотипу Firefox - imgur.com/a/wV3MSQX
Dana

1
@dana За коментарем ОП , підтримка альфа-каналів не є обов'язковою.
Мего

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).
Мего

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.