这是什么颜色?


9

您要打高尔夫球的程序将以文件名作为输入,并且必须输出文件的颜色。

该文件将具有这些扩展名中的任何一个,但您的程序仅需要支持一个。请说出答案中的哪一个。

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

现在到经典布局。

输入项

具有上述扩展名之一的文件名。

您也可以取一个图像对象或已编码的图像。

输出量

该文件中唯一的颜色是6位十六进制代码,带有可选的前导,#例如#000000黑色。

您还可以输出包含RGB颜色的十进制或十六进制值的列表/元组/字符串,并带有清晰的非数字定界符,例如 , |etc

您可能不输出透明度。

如果文件不是所有颜色,则必须输出一个不是的假值,#000000并在打印任何内容的情况下终止STDERR。这样一来,您就不能简单地打开文件并获取第一个像素的RGB值。

规则

  • 仅当文件为一种颜色时才需要输出十六进制代码。
  • 该文件将是500x500像素
  • 像素将全部具有0%的透明度。
  • 这是 最短的代码胜出!

例子


7
文件全不是一种颜色,对我来说似乎是不必要的复杂化。而且强类型语言(例如C#)中的false值只能是a bool。对于这种情况,我string将为普通情况和bool非普通情况返回,并包装在中object。这样可以吗,或者我可以返回一个空字符串或类似的字符串?
TheLethalCoder

5
另外,我建议将您的图像上传到i.stack.imgur.com(我的程序无法从粘贴板上获得图像)
user41805

1
我们有图像输入的默认标准,您可以在此处的meta上找到它。它与您所拥有的并没有太大区别,但是您可能想要链接到它而不是所提供的。
帕维尔

6
@Ilikemydog确实很重要。说输出是“该文件中唯一的颜色”,会使回答者认为图像将包含单一颜色。然后,规则与此矛盾。另一方面,如果输出部分读取诸如“该文件中唯一的颜色,或者如果图像包含多个颜色的伪造的值,则与...不同的值”之类的东西,将会更加清晰。或者,正如xnor恰当地指出的那样,当挑战的主体说出一件事而另一部分说出另一件事时
Luis Mendo

2
我们是否假设所有文件始终都是3通道(每个8位)RGB文件?
八达通

Answers:


6

MATL15 12字节

Yi6Bed~?2MYm

测试了挑战中给出的“ .png”图像。它可能也可以与其他扩展一起使用。输入可以是文件名或图像的URL。

输出是用空格分隔的R,G,B十进制值,如果有多种颜色,则输出为空字符串(虚假)。

第一个和最后一个测试用例的示例:

在此处输入图片说明

说明

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

这是否具有伪造图像的检查?
TheLethalCoder

1
@TheLethalCoder解决了。感谢您的单挑
Luis Mendo'May

You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

@TheLethalCoder谢谢。我认为此答案无济于事,除非我可以M×N×3直接输入数组,否则这可能不是OP的意思
Luis Mendo

1
12个字节?!好吧,天哪!
毛茸茸的

4

Bash + core-utils + Imagemagick,60岁

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

如果存在一种颜色,则输出颜色;如果存在一种以上的颜色,则不输出任何颜色。

  • convert $1 txt: 读取输入文件并将其输出为文本文件,特别是采用以下格式:
#ImageMagick像素枚举: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 -uk3按第三列唯一地对其进行排序。此输出分配给数组a

  • ((${#a[@]}-9)) 测试数组的长度是否不为9

  • 如果数组的长度不为9(即长度为9),则输出元素2(基于0)将是唯一的颜色。


1
哦,我的,令人印象深刻。
MD XF

4

的JavaScript(ES6)+ HTML,315 289 243 218 217个 215 211 210 208字节

检查所有像素是否相同会增加很多字节。直到它没有比我只检查第一个像素的颜色大得多-对此感到满意:)

取(可以被用作绝对的,相对的,数据或任何的URL srcimg图像文件作为输入的)。将RGB颜色输出为逗号分隔的字符串或0false。经过PNG文件测试,但也应与JPG&GIF一起使用。

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

尝试一下

需要在元素>上添加一个结束canvas符才能在代码段中工作。由于从外部来源提取图像会导致引发错误,因此以下内容将采用Base-64数据URL作为输入。取消注释最后一行,以使用由4种测试颜色组成的图像测试不同的颜色。

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>


A filename with one of the above extensions.->您确定可以将图像作为编码的字符串,而不是从文件加载吗?
TheLethalCoder

1
@TheLethalCoder,不!:D而且,既然您这样说,我就能看到如何保存一些字节了:)
毛茸茸的

You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

@TheLethalCoder,我可以"data:image/png;base64,"+通过将输入作为URL来切掉我的代码。
毛茸茸的

3

Python 2,80个字节

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

PIL.Image具有getcolors函数,None如果颜色的数量大于参数,该函数将返回,并返回[(pixels, (r,g,b,a)), ...]结构中颜色的直方图。


You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

@TheLethalCoder那么,我应该假定一个已经打开的图像并开始写print i and i[0][1][:3]
加伯·费克特(GáborFekete)

我以为您需要致电给“颜色”
部门-TheLethalCoder

3

Mathematica,55 51字节

-4感谢CalculatorFeline

+0用于重构为完整功能。

使用Mathematica图像对象作为输入- Import["filename.png"]

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

如果不是所有一种颜色,则返回0。如果只有一个,则输出颜色的十进制值。

说明:

                                 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

a==1== a<2并且在这种情况下Join@@等效~Flatten~1。(如果列表包含任何非列表,则加入会中断。)
CalculatorFeline

默认情况下,需要完整的功能或程序。对于使用已经解码的图像对象,我相信您仍然需要做类似的事情If[Length@#==1,#,0]&@Union[ImageData@#~Flatten~1]&
朱利安·沃尔夫

我曲解了OP的评论You may also take an image object or already encoded image instead.。将更新。
伊恩·米勒

@CalculatorFeline感谢您的提示Join@@
伊恩·米勒

2

Java的8+,331个 165 119字节

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

-感谢@LethalCoder在规则更改方面为我更新了很多
字节,从而允许进行许多高尔夫球运动-46个感谢@KevinCruijssen和固定错字


You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

@TheLethalCoder太完美了。谢谢!
HyperNeutrino

我知道它已经有一段时间,但有些事情高尔夫(不改变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);}。通过将Java版本更改为8+,您还可以更改Object f(java.awt.image.BufferedImage i)i->。另外,我觉得自己犯了拼写错误:不应该if(i.getRGB(k,l)!=i)!=j呢?
凯文·克鲁伊森

@KevinCruijssen谢谢。是的,我想我做了:P
HyperNeutrino,

1
@HyperNeutrino您忘记将其更改为Java 8(或更高版本)。;)
Kevin Cruijssen

1

Python 2中123 85个字节

from PIL import Image
c=Image.open(input()).getdata()
print len(set(c))<2and c[0][:3]

You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

我希望从PIL import *保存一些字节(或者,导入PIL然后c = PIL.Image),除非我忽略了一些内容
Foon

@Foon PIL是一个例外,进口,你不能这样做from PIL import*,也没有PIL.
罗德

谢谢; 不知道或至少忘记了它
Foon

不一致是可怕的:(
CalculatorFeline

1

C#,163个 128 125字节

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

感谢@Kevin Cruijssen,节省了3个字节。

如果我们不需要额外检查图像是否为相同颜色,则只有55个字节:

b=>{var c=b.GetPixel(0,0);return c.R+" "+c.G+" "+c.B;};

我知道已经有一段时间了,但是: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字节)
Kevin Cruijssen

0

Mathematica,112个字节

图片

i =导入@“ c:\ a.png”;

If[Length@DominantColors@i==1,"#"<>StringPadLeft[IntegerString[Most@PixelValue[i,{1,1},"Byte"],16],2,"0"],False]

You may also take an image object or already encoded image instead.更新的OP可能能够保存字节...
TheLethalCoder

好。我做了一些
更改

小写的十六进制可以接受吗?
user202729

Most@PixelValue[i, {1, 1}, "Byte"]将节省一些字节。
user202729

103字节:If[Length@Tally[a=i~ImageData~"Byte"]<2,"#"<>StringPadLeft[Most@a[[1,1]]~IntegerString~16,2,"0"],False]-使用您的ImageData函数。不知道那存在。
user202729

0

Bash + ImageMagick,100字节

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

经过.png测试,也应与其他格式一起使用。多色图像的输出只是一个空字符串。


您可以删除格式说明符周围的引号。也((`identify -format %k $1`-1))||比短i=$(expr `identify -format "%k" $1` = 1)&&
Digital Trauma

0

C,224205字节

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

将500x500位图用作命令行参数。打印文件的RGB,例如255,255,2550如果文件不是恒定的。如果未提供文件,则可能会严重崩溃。

有趣的注意事项:

  • 用途void*在的地方FILE*,以避免包括<stdio.h>
  • 使用一个简单的for循环i%3来确定所有字节是否相同
  • 可以 golfed,我golfed 50个字节,而写这答案
  • BMP将颜色存储为BGR,因此它或多或少地向后读取

0

JavaScript + HTML,143 + 23 = 166字节

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>

尝试一下:

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>

少打高尔夫球:

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

0

PowerShell,79个字节

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

少打高尔夫的测试脚本:

$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"
}
  • 注1:表达式499..0*500表示:重复500次,范围是499至0
  • 注2:表达$b|% G*l $_ $y 是快捷方式$b.GetPixel($_,$y)。此技巧对gofing很有用,但会降低代码速度。

输出$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:

输出$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:

说明:

  • 脚本会创建每个像素颜色的数组。
  • 该脚本适用于颜色数组gu(对于Get-Unique来说是别名)。
  • 如果结果为hu单个元素(属性rank仅具有数组的值),则输出此元素的R,G,B的十进制值

0

Python 2 + OpenCV + NumPy:66个字符

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

结果:

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

18:15 ~/colors $ 

OpenCV能够读取图像并将其作为N维数组返回。NumPy用于相对于其他像素测试第一个像素,并打印出RGB值或空白。


0

PHP,88字节

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

匿名函数将带有索引的PHP图像资源作为参数,在第一个调色板插槽中采用颜色,返回颜色代码或0。

程序,96字节

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

从参数获取GIF文件名,不打印颜色代码。用运行php -r '<code>' <filename.gif>

用于真彩色图像,113112字节

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

如上所述,但是需要真实彩色图像。

程序,122 116字节

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

如上,但需要PNG文件。

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.