代码高尔夫:1x1黑色像素

30

最近,我使用我最喜欢的图像编辑器制作了一个1x1的黑色像素(当你想要便宜地在HTML中绘制实心矩形时,这会很有用)。虽然我将它制作成单色PNG格式,但它的大小仍达到了120字节!我的意思是,那有点太大了。120字节。只为了一个像素。然后我将它转换为GIF格式,将其大小降至43字节。好多了,但仍然...

挑战

生成或表示一个1x1的黑色像素的最短图像文件或程序。提交可以是:

  • 代表一个1x1黑色像素的图像文件。所选择的格式必须能够代表比1x1更大的图像,并且不能是临时格式(也就是说,它不能是你刚刚为代码高尔夫发明的图像格式)。图像文件将按字节计数排名。
  • 生成此类图像文件的程序。程序将按字符计数排名,与代码高尔夫中一样。

只要答案属于这两个类别之一,任何东西都可以接受。

对于图像文件,请使用十六进制或转义序列指定它们,而不要使用外部图像主机 :-)


每像素1位是否可以?在Windows上,您可以创建的最小文件大小是多少?还是在内存中? - Chris S
是的,每像素1位是可以的,但图像格式必须能够容纳更大的单色图像。我不确定您所说的最小文件大小是什么意思,但使用的磁盘空间(例如4096字节)并不重要;文件大小本身很重要。 - Joey Adams
4
我不喜欢这个问题,因为它违反了我关于“解决一个类或问题”的代码挑战要求。请参阅http://meta.stackexchange.com/questions/24242/acceptable-level-of-code-golf-questions,了解一些社区对SO上的[code-golf]的看法。 - dmckee --- ex-moderator kitten
3
对此的一个反驳是,这个问题的答案介绍了读者各种渲染格式和技术。看起来这是学习 PGM、PBM、Logo、Python Imaging Library、PostScript、SVG 和 XPM 的好地方。如果我需要编程绘制图像,现在我知道了一些好的起点。 - Joey Adams
17个回答

2
我曾经使用过的一种旧的图像格式:4个字节。
 01 00 00 0C

这个格式由一个16位整数数组组成(小端模式):

位映射:

0-10:  number of pixels to shade
10-11: control bits
12-15: VGA16 pidel color

控制位值:

0: normal
1: end of line
3: end of file

从第三行开始阅读,描述了整个文件格式。没有魔数,图像尺寸是通过扫描线的解释隐含的(如果图像是锯齿状的,则参考实现会将额外的空间涂黑)。 - Joshua

2

SVG,59个字符:

<svg><rect width="1" height="1" style="fill:#000;"/></svg>

很遗憾,包括 Doctype 后,它的大小增长到 157...:
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg><rect width="1" height="1" style="fill:#000;"/></svg>

幸运的是,你可以使用 <!DOCTYPE html> 代替,并省略任何命名空间等,因为它是有效的HTML5。我认为大多数HTML5引擎并不真正关心是否有文档类型,所以你的第一个示例应该没问题。 - Eli Grey

2

虽然我来晚了,但是http://www.perlmonks.org/?node_id=7974提供了比目前所有回答都更加通用的解决方案:

## tinygif
## World's Smallest Gif
## 35 bytes, 43 if transparent

use strict;
my($RED,$GREEN,$BLUE,$GHOST,$CGI);

## Adjust the colors here, from 0-255
$RED   = 255;
$GREEN = 0;
$BLUE  = 0;

## Set $GHOST to 1 for a transparent gif, 0 for normal
$GHOST = 0;

## Set $CGI to 1 if writing to a web browser, 0 if not
$CGI = 0;

$CGI && printf "Content-Length: %d\nContent-Type: image/gif\n\n", 
  $GHOST?43:35;
printf "GIF89a\1\0\1\0%c\0\0%c%c%c\0\0\0%s,\0\0\0\0\1\0\1\0\0%c%c%c\1\0;",
  144,$RED,$GREEN,$BLUE,$GHOST?pack("c8",33,249,4,5,16,0,0,0):"",2,2,4;

2

DrRacket: 23 chars

#lang slideshow
(disk 1)

1

XPM, 57字节

/* XPM */
static char *_x_[] = {"1 1 1 1",".c #000","."}

在寻找维基百科文章链接时,我发现了XPM2,26字节,但我无法在这里使用任何程序打开它。

! XPM2
1 1 1 1
. c #000
.

1

Rebmu:16个字符

en'PNGmkIM![1x1]

如果你想让它根据传入的参数保存到文件中,那么程序就需要再增加三个字符:
rebmu/args [wrAen'PNGmkIM![1x1]] %my-black-pixel.png

该程序是以下 Rebol 的简写形式,为了清晰起见添加了括号:
write a (encode 'png (make image! [1x1]))

0
<div style="height: 0; width: 1px; border-top: 1px solid #000">

但是定位它会需要更多的工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接