Warna apa ini?

9

Anda harus menjalankan program yang akan menggunakan nama file sebagai input dan Anda harus menampilkan apa warna file tersebut.

File akan memiliki salah satu dari ekstensi ini tetapi program Anda hanya perlu mendukungnya. Tolong katakan yang mana dalam jawaban Anda.

  • .jpg
  • .png
  • .svg
  • .gif
  • .bmp

Dan sekarang ke tata letak klasik.

Memasukkan

Nama file dengan salah satu ekstensi di atas.

Anda juga dapat mengambil objek gambar atau gambar yang sudah disandikan.

Keluaran

Satu-satunya warna dalam file itu sebagai kode hex 6 digit dengan opsional terkemuka #misalnya #000000hitam.

Anda juga dapat menampilkan daftar / tupel / string yang berisi nilai desimal atau hex dari warna RGB, dengan pembatas yang non-numerik, misalnya, , |dll.

Anda mungkin tidak menghasilkan transparansi.

Jika file tidak semuanya berwarna, Anda harus menampilkan nilai palsu yang tidak #000000dan berakhir tanpa mencetak apa pun STDERR. Ini agar Anda tidak bisa begitu saja membuka file dan mendapatkan nilai RGB dari piksel pertama.

Aturan

  • Kode hex hanya perlu dikeluarkan jika file semuanya satu warna.
  • File tersebut akan menjadi 500x500piksel
  • Pixel semua akan memiliki transparansi 0%.
  • Ini adalah sehingga kode terpendek menang!

Contohnya

caird coinheringaahing
sumber
7
File semua tidak menjadi satu warna sepertinya komplikasi yang tidak perlu bagi saya. Dan nilai falsey dalam bahasa yang sangat diketik, misalnya C #, hanya bisa a bool. Untuk kasus ini saya akan mengembalikan stringuntuk kasus normal dan booluntuk kasus tidak normal, dibungkus dengan object. Apakah ini baik atau saya dapat mengembalikan string kosong atau serupa?
TheLethalCoder
5
Saya juga menyarankan untuk mengunggah gambar Anda ke i.stack.imgur.com (program saya tidak dapat menghapus gambar dari papan gambar)
user41805
1
Kami memiliki standar standar untuk input gambar, Anda dapat menemukannya di meta kami di sini . Ini tidak jauh berbeda dari apa yang Anda miliki, tetapi Anda mungkin ingin menautkannya daripada yang Anda berikan.
Pavel
6
@Ilikemydog Tidak masalah. Mengatakan output adalah "Satu-satunya warna dalam file itu" mengarahkan penjawab untuk menganggap bahwa gambar akan berisi satu warna. Kemudian aturan itu bertentangan. Di sisi lain, akan jauh lebih jelas jika bagian keluaran membaca sesuatu seperti "Satu-satunya warna dalam file itu, atau nilai palsu berbeda dari ... jika gambar berisi lebih dari satu warna". Atau, seperti yang dikatakan dengan tepat, membingungkan ketika tubuh tantangan mengatakan satu hal tetapi bagian selanjutnya mengatakan hal lain
Luis Mendo
2
Apakah kita berasumsi bahwa semua file akan selalu menjadi 3 channel (masing-masing 8 bit) file RGB?
Octopus

Jawaban:

6

MATL , 15 12 byte

Yi6Bed~?2MYm

Diuji dengan gambar ".png" yang diberikan dalam tantangan. Mungkin juga bekerja dengan ekstensi lain. Input dapat berupa nama file atau URL gambar.

Output adalah nilai desimal R, G, B yang dipisahkan oleh spasi, atau string kosong (yang salah) jika ada lebih dari satu warna.

Contoh dengan kasus uji pertama dan terakhir:

masukkan deskripsi gambar di sini

Penjelasan

Yi      % Implicitly input filename. Read image as an M×N×3 array
6B      % Push [true true false] (6 in binary)
e       % Reshape. This collapses firsts two dimensions. Gives an (M*N)×3 array
d       % Consecutive diferences down each column. Gives an an (M*N-1)×3 array
~?      % If all those differences are zero (this means there is a single color)
  2M    %   Push the (M*N)×3 array again
  Ym    %   Mean of each column
        % Implicit end
        % Implicitly display
Luis Mendo
sumber
Apakah ini memiliki pemeriksaan untuk gambar falsey?
TheLethalCoder
1
@TheLethalCoder Dipecahkan. Terima kasih untuk yang hadir
Luis Mendo
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
@TheLethalCoder Terima kasih. Saya tidak berpikir itu membantu dalam jawaban ini, kecuali saya bisa memasukkan M×N×3array secara langsung, yang mungkin bukan apa yang dimaksud OP
Luis Mendo
1
12 byte ?! Ya ampun!
Shaggy
4

Bash + core-utils + Imagemagick, 60

a=(`convert $1 txt:|sort -uk3`)
((${#a[@]}-9))||echo ${a[2]}

Output warna jika ada satu warna dan tidak ada jika ada lebih dari satu warna.

  • convert $1 txt: membaca file input dan output sebagai file teks, khususnya dalam format ini:
# ImageMagick pixel enumeration: 500.500.255, srgba
0,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
1,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
2,0: (245,236,236,1) # F5ECEC srgba (245,236,236,1)
3.0: (245.235.235,1) # F5EBEB srgba (245.235.235,1)
4.0: (245.235.235,1) # F5EBEB srgba (245.235.235,1)
  • sort -uk3urutkan secara unik pada kolom ketiga. Output ini ditugaskan ke arraya

  • ((${#a[@]}-9)) menguji apakah array TIDAK memiliki panjang 9

  • jika array TIDAK memiliki panjang 9 (yaitu memang memiliki panjang 9), maka elemen output 2 (berbasis 0) yang akan menjadi warna unik.

Trauma Digital
sumber
1
Ya ampun, itu mengesankan.
MD XF
4

JavaScript (ES6) + HTML, 315 289 243 218 217 215 211 210 208 byte

Memeriksa semua piksel yang identik menambahkan banyak byte. Down to it tidak menjadi lebih besar daripada ketika saya hanya memeriksa warna piksel pertama - senang dengan itu :)

Mengambil URL (absolut, relatif, data atau apa pun yang dapat digunakan sebagai srcdari img) file gambar sebagai input. Output warna RGB sebagai string yang dipisahkan koma atau 0untuk falsey. Diuji dengan file PNG tetapi harus bekerja dengan JPG & GIF juga.

u=>(a=[...Array(c.width=c.height=500)]).map((_,x)=>a.map((_,y)=>(v=""+[(d=g.getImageData(x,y,1,1).data)[0],d[1],d[2]],h=x&y?v!=h?0:h:v)),i.src=u,(g=c.getContext`2d`).drawImage(i,0,0))&&h
<img id=i><canvas id=c

Cobalah

Memerlukan penambahan penutupan >pada canvaselemen agar dapat bekerja dalam Cuplikan. Karena menarik gambar dari sumber eksternal akan menyebabkan kesalahan untuk dilemparkan, yang berikut ini akan menggunakan URL data Base-64 sebagai input. Batalkan komentar pada baris terakhir untuk menguji warna yang berbeda menggunakan gambar yang terdiri dari 4 warna tes.

f=
u=>(a=[...Array(c.width=c.height=500)]).map((_,x)=>a.map((_,y)=>(v=""+[(d=g.getImageData(x,y,1,1).data)[0],d[1],d[2]],h=x&y?v!=h?0:h:v)),i.src=u,(g=c.getContext`2d`).drawImage(i,0,0))&&h
console.log(f("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQMAAADxGE3JAAAAA1BMVEUWwpMvG5UqAAAANUlEQVR42u3BMQEAAADCIPun9lkMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fQAAASJ0bysAAAAASUVORK5CYII"))
//console.log(f("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AgMAAAC2uDcZAAAADFBMVEWLFsIWwpOVkJCE8Az9F2TyAAABB0lEQVR42uzNIQEAMAwDsEk8ucmTS9xElAwkBlI3cipit9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91uX72/yO+I3W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdPhu1fdT2UdtHbR+1fdT2UdsHs+0AqVGfBnNZ7+UAAAAASUVORK5CYII"))
<img id=i><canvas id=c>

Shaggy
sumber
A filename with one of the above extensions.-> Anda yakin dapat mengambil gambar sebagai string yang disandikan alih-alih memuat dari file?
TheLethalCoder
1
@TheLethalCoder, Tidak! : D Dan, sekarang Anda mengatakannya, saya dapat melihat bagaimana saya dapat menyimpan beberapa byte :)
Shaggy
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
@TheLethalCoder, saya dapat memotong "data:image/png;base64,"+kode saya dengan mengambil input sebagai URL.
Shaggy
3

Python 2, 80 byte

from PIL import Image
i=Image.open(input()).getcolors(1)
print i and i[0][1][:3]

PIL.Image memiliki fungsi getcolors yang mengembalikan Nonejika jumlah warna lebih besar dari parameter dan mengembalikan histogram warna dalam suatu [(pixels, (r,g,b,a)), ...]struktur.

Gábor Fekete
sumber
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
@TheLethalCoder Jadi saya harus menganggap gambar sudah dibuka dan hanya menulis print i and i[0][1][:3]?
Gábor Fekete
Saya berasumsi Anda akan memerlukan panggilan get colors
TheLethalCoder
3

Mathematica, 55 51 Bytes

-4 Terima kasih kepada CalculatorFeline

+0 untuk refactoring menjadi fungsi penuh.

Menggunakan objek gambar Mathematica sebagai input - Import["filename.png"].

If[Length@#==1,#,0]&@Union[Join@@ImageData@#]&

Mengembalikan 0 jika tidak semua satu warna. Menghasilkan nilai desimal warna jika hanya satu.

Penjelasan:

                                 ImageData@# & - Convert input into 2D array of RGB values
                           Join@@              - Join the array into 1D array f RGB values
                     Union[                 ]  - Union all the RGB values
   Length@#        &@                          - Find length of the union of arrays
If[        ==1,#,0]                            - Check if its 1, return it if true, return 0 if not
Ian Miller
sumber
a==1== a<2dan Join@@setara dengan ~Flatten~1dalam hal ini. (Gabung istirahat jika daftar berisi daftar tidak ada.)
CalculatorFeline
Secara default, fungsi atau program lengkap diperlukan. Untuk menggunakan objek gambar yang sudah diterjemahkan, saya yakin Anda masih perlu melakukan sesuatu sepertiIf[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
Julian Wolf
Saya salah menafsirkan komentar OP You may also take an image object or already encoded image instead.. Akan diperbarui.
Ian Miller
@CalculatorFeline Terima kasih atas petunjuk tentang Join@@.
Ian Miller
2

Java 8+, 331 165 119 byte

i->{Integer j=i.getRGB(0,0),k=500,l;for(;k-->0;)for(l=500;l-->0;)if(i.getRGB(k,l)!=j)return"";return j.toHexString(j);}

-banyak byte terima kasih kepada @LethalCoder untuk memperbarui saya pada perubahan aturan yang memungkinkan untuk banyak bermain golf
-46 byte berkat @KevinCruijssen dan kesalahan ketik tetap

HyperNeutrino
sumber
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
@TheLethalCoder Oh sempurna. Terima kasih!
HyperNeutrino
Aku tahu itu sudah lama, tapi beberapa hal untuk golf (tanpa mengubah versi Java 7): Object f(java.awt.image.BufferedImage i){Integer j=i.getRGB(0,0),k=500,l;for(;k-->0;)for(l=500;l-->0;)if(i.getRGB(k,l)!=i)return"";return j.toHexString(j);}. Dengan mengubah versi Java ke 8+, Anda juga dapat mengubah Object f(java.awt.image.BufferedImage i)ke i->. Juga, saya pikir Anda sudah salah ketik: tidak harus if(i.getRGB(k,l)!=i)menjadi !=jbukan?
Kevin Cruijssen
@KevinCruijssen Terima kasih. Dan ya, saya pikir saya lakukan: P
HyperNeutrino
1
@HyperNeutrino Anda lupa mengubahnya ke Java 8 (atau lebih tinggi). ;)
Kevin Cruijssen
1

Python 2 , 123 85 byte

from PIL import Image
c=Image.open(input()).getdata()
print len(set(c))<2and c[0][:3]
tongkat
sumber
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
Saya harapkan dari impor PIL * untuk menghemat beberapa byte (atau sebagai alternatif, impor PIL dan kemudian c = PIL.Image) kecuali saya sedang melihat sesuatu
Foon
@Foon PILadalah pengecualian untuk impor, Anda tidak dapat melakukannya from PIL import*jugaPIL.
Rod
Terima kasih; tidak tahu itu atau setidaknya melupakannya
Foon
Inkonsistensi mengerikan :(
CalculatorFeline
1

C #, 163 128 125 byte

b=>{var c=b.GetPixel(0,0);for(int w=500,h;w-->0;)for(h=500;h-->0;)if(b.GetPixel(w,h)!=c)return"";return c.R+" "+c.G+" "+c.B;}

Disimpan 3 byte berkat @Kevin Cruijssen.

Jika kami tidak perlu memiliki pemeriksaan tambahan untuk gambar yang berwarna sama, ini hanya 55 byte:

b=>{var c=b.GetPixel(0,0);return c.R+" "+c.G+" "+c.B;};
TheLethalCoder
sumber
Saya tahu ini sudah lama, tapi: b=>{var c=b.GetPixel(0,0);for(int w=500,h;w-->0;)for(h=500;h-->0;)if(b.GetPixel(w,h)!=c)return"";return c.R+" "+c.G+" "+c.B;}(-3 byte)
Kevin Cruijssen
0

Mathematica, 112 byte

gambar

i = Impor @ "c: \ a.png";

If[Length@DominantColors@i==1,"#"<>StringPadLeft[IntegerString[Most@PixelValue[i,{1,1},"Byte"],16],2,"0"],False]
J42161217
sumber
You may also take an image object or already encoded image instead.OP yang diperbarui mungkin dapat menyimpan byte ...
TheLethalCoder
baik. Saya membuat beberapa perubahan. Terima kasih
J42161217
Apakah huruf kecil hex dapat diterima?
user202729
Most@PixelValue[i, {1, 1}, "Byte"]akan menghemat beberapa byte.
user202729
103 byte: If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]- gunakan fungsi ImageData Anda. Tidak tahu itu ada.
user202729
0

Bash + ImageMagick, 100 byte

i=$(expr `identify -format "%k" $1` = 1)&&convert $1 -format "%c" histogram:info:-|grep -o "#......"

Diuji dengan .png, harus bekerja dengan format lain juga. Output untuk gambar polikromatik hanyalah string kosong.

3141
sumber
Anda dapat menjatuhkan tanda kutip dari sekitar penentu format. Juga ((`identify -format %k $1`-1))||lebih pendek dari i=$(expr `identify -format "%k" $1` = 1)&&.
Digital Trauma
0

C, 224 205 byte

m[3],i;
main(c,v)char**v;{
void*s=fopen(v[1],"r");
for(;i<54;i++)getc(s);
m[2]=getc(s);m[1]=getc(s);*m=getc(s);
for(i=0;i<500*500;i++)if((c=getc(s))!=m[i%3]&&~c)exit(puts("0"));
printf("%d,%d,%d",*m,m[1],m[2]);}

Mengambil bitmap 500x500 sebagai argumen baris perintah. Mencetak RGB file, misalnya 255,255,255, atau 0jika file tidak konstan. Mungkin macet parah jika tidak ada file yang disediakan.

Poin menarik untuk diperhatikan:

  • Penggunaan void*di tempat FILE*untuk menghindari termasuk<stdio.h>
  • Menggunakan forloop sederhana dengan i%3untuk menentukan apakah semua byte sama
  • Bisa sangat golf, saya golf 50 byte saat menulis jawaban ini
  • BMP menyimpan warna sebagai BGR sehingga lebih / kurang dibaca mundur
MD XF
sumber
0

JavaScript + HTML, 143 + 23 = 166 byte

u=>(i.src=u,s=C.width=C.height=500,c=C.getContext`2d`,c.drawImage(i,0,0),d=c.getImageData(0,0,s,s).data,!d.some((n,i)=>n-d[i%4])&&d.slice(0,3))
<img id=i><canvas id=C>

Cobalah:

f=
u=>(i.src=u,s=C.width=C.height=500,c=C.getContext`2d`,c.drawImage(i,0,0),d=c.getImageData(0,0,s,s).data,!d.some((n,i)=>n-d[i%4])&&d.slice(0,3))

console.log(
    f('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AQMAAADxGE3JAAAAA1BMVEUWwpMvG5UqAAAANUlEQVR42u3BMQEAAADCIPun9lkMYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5fQAAASJ0bysAAAAASUVORK5CYII'),
    f('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfQAAAH0AgMAAAC2uDcZAAAADFBMVEWLFsIWwpOVkJCE8Az9F2TyAAABB0lEQVR42uzNIQEAMAwDsEk8ucmTS9xElAwkBlI3cipit9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91uX72/yO+I3W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdbrfb7Xa73W632+12u91ut9vtdrvdPhu1fdT2UdtHbR+1fdT2UdsHs+0AqVGfBnNZ7+UAAAAASUVORK5CYII')
)
<img id=i><canvas id=C>

Kurang golf:

u => {
    i.src = u
    s = C.width = C.height = 500
    c = C.getContext('2d')
    c.drawImage(i, 0, 0)
    d = c.getImageData(0, 0, s, s).data
    return d.every((n,i) => n == d[i % 4]) && d.slice(0,3)
}
Darrylyeo
sumber
0

PowerShell, 79 byte

param($b)if(!($c=499..0*500|%{$b|% G*l $_ $y;$y+=!$_}|gu).Rank){$c.R;$c.G;$c.B}

Skrip uji yang kurang golf:

$f = {

    param($b)
    $c=499..0*500|%{$b.GetPixel($_,$y);$y+=!$_}|gu
    if(!$c.Rank){
        $c.R;$c.G;$c.B
    }

}

@(
    ,("22 194 147", "https://cdn.pbrd.co/images/8bawQk5kM.png")
    ,("139 22 194", "https://cdn.pbrd.co/images/8b9foR0H6.png")
    ,("149 144 144","https://cdn.pbrd.co/images/8baglmIE8.png")
    ,("132 240 12", "https://cdn.pbrd.co/images/8b9Uhhovn.png")
    ,("",           "https://cdn.pbrd.co/images/8bb4DeKx3.png")

) | % {
    $expected,$s = $_

    $binData = [System.Net.WebClient]::new().DownloadData($s)
    $memoryStream = [System.IO.MemoryStream]::new($binData)
    $bitmap = [System.Drawing.Bitmap]::FromStream($memoryStream)

    $sw = [System.Diagnostics.Stopwatch]::StartNew()
    $result = &$f $bitmap
    "$("$result"-eq$expected): $($sw.Elapsed): $result"
}
  • Catatan 1 : ekspresi 499..0*500berarti: ulangi 500 kali rentang dari 499 ke 0
  • Catatan 2 : ekspresi $b|% G*l $_ $y adalah jalan pintas untuk $b.GetPixel($_,$y). Trik ini berguna dengan gofing, tetapi memperlambat kode.

Output dengan $b|% G*l $_ $y:

True: 00:01:45.4904622: 22 194 147
True: 00:01:56.4208157: 139 22 194
True: 00:01:46.7629439: 149 144 144
True: 00:01:48.1999005: 132 240 12
True: 00:01:55.8579935:

Output dengan $b.GetPixel($_,$y):

True: 00:00:05.7637937: 22 194 147
True: 00:00:06.8743244: 139 22 194
True: 00:00:08.7456055: 149 144 144
True: 00:00:08.5942450: 132 240 12
True: 00:00:06.6495706:

Penjelasan:

  • skrip membuat array dari setiap warna piksel.
  • skrip berlaku gu(alias untuk Dapatkan-Unik ) ke array warna.
  • jika hasilnya huadalah elemen tunggal (properti rankmemiliki nilai untuk array saja) maka output nilai desimal dari R, G, B dari elemen ini
mazzy
sumber
0

Python 2 + OpenCV + NumPy: 66 karakter

colors.py

import numpy as N
def c(i):p=i[0,0];print(p[::-1],"")[N.any(i-p)]

test.py

import cv2
from colors import c

c(cv2.imread('16C293.png'))
c(cv2.imread('84F00C.png'))
c(cv2.imread('8B16C2.png'))
c(cv2.imread('959090.png'))
c(cv2.imread('falsy.png'))

Hasil:

18:14 ~/colors $ python test.py
[ 22 194 147]
[132 240  12]
[139  22 194]
[149 144 144]

18:15 ~/colors $ 

OpenCV dapat membaca gambar dan mengembalikannya sebagai array N-dimensi. NumPy digunakan untuk menguji piksel pertama terhadap piksel lainnya dan mencetak nilai RGB atau kosong.

dana
sumber
0

PHP, 88 byte

function($i){return~-imagecolorstotal($i)?0:sprintf("#%06x",imagecolorsforindex($i,0));}

fungsi anonim mengambil sumber gambar PHP yang diindeks sebagai parameter, mengasumsikan warna dalam slot palet pertama, mengembalikan kode warna atau 0.

program, 96 byte

imagecolorstotal($i=imagecreatefromgif($argv[1]))-1||sprintf("#%06x",imagecolorsforindex($i,0));

mengambil nama file GIF dari argumen, mencetak kode warna atau tidak sama sekali. Jalankan dengan php -r '<code>' <filename.gif>.

untuk gambar warna asli, 113 112 byte

function($i){for(;$p<25e4;$p++)$r[$c=imagecolorat($i,$p%500,$p/500)]=1;return~-count($r)?0:sprintf("#%06x",$c);}

seperti di atas, tetapi membutuhkan gambar warna yang benar.

program, 122 116 byte

for(;$p<25e4;$p++)$r[$c=imagecolorat(imagecreatefrompng($argv[1]),$p%500,$p/500)]=1;count($r)-1||printf("#%06x",$c);

seperti di atas, tetapi membutuhkan file PNG.

Titus
sumber