【问题标题】:Code Golf: 1x1 black pixel代码高尔夫:1x1 黑色像素
【发布时间】:2011-02-25 08:53:08
【问题描述】:

最近,我使用我最喜欢的图像编辑器制作了一个 1x1 黑色像素(当您想以低成本在 HTML 中绘制实心框时,它可以派上用场)。尽管我把它做成了单色 PNG,但结果却是 120 字节!我的意思是,这有点陡峭。 120 字节。 对于一个像素。然后我将其转换为 GIF,将大小降低到 43 个字节。好多了,但仍然...

挑战

生成 1x1 黑色像素的最短图像文件或程序。提交可能是:

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

只要答案属于这两个类别之一,任何事情都是公平的游戏。

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

【问题讨论】:

  • 每像素 1 位可以吗?您可以在 Windows 上创建的最小文件大小是多少?还是在记忆中
  • 是的,每像素 1 位是可以的,但图像格式必须能够容纳更大的单色图像。我不确定最小文件大小是什么意思,但使用的磁盘空间(例如 4096 字节)并不重要;文件大小本身很重要。
  • 我不喜欢这个问题,因为它违反了我对代码高尔夫的“解决课程或问题”要求。有关 SO 上 [code-golf] 的一些社区想法,请参阅 meta.stackexchange.com/questions/24242/…
  • @dmckee:对此的反驳是,这个问题的答案向读者介绍了各种渲染格式和技术。它看起来是开始学习 PGM、PBM、Logo、Python 图像库、PostScript、SVG 和 XPM 的好地方。如果我需要以编程方式绘制图像,我现在知道一些不错的起点。

标签: language-agnostic code-golf rosetta-stone image-compression


【解决方案1】:
<div style="height: 0; width: 1px; border-top: 1px solid #000">

但定位需要更多时间。

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案3】:

      DrRacket: 23 个字符

      #lang slideshow
      (disk 1)
      

      【讨论】:

        【解决方案4】:

        Rebmu: 16 个字符

        en'PNGmkIM![1x1]
        

        如果您希望根据传入的参数将其保存到文件中,则会在程序中再添加三个字符:

        rebmu/args [wrAen'PNGmkIM![1x1]] %my-black-pixel.png
        

        该程序是以下 Rebol 的简写,为清楚起见添加了括号:

        write a (encode 'png (make image! [1x1]))
        

        【讨论】:

          【解决方案5】:

          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>
          

          【讨论】:

          • 幸运的是,您可以使用 &lt;!DOCTYPE html&gt; 代替任何命名空间等,因为它是有效的 HTML5。我假设大多数 HTML5 引擎并不真正关心是否有文档类型,所以你的第一个例子应该没​​问题。
          【解决方案6】:

          Python(带 PIL)(85 个字符):

          from PIL import Image
          i=Image.new("P",(1,1))
          i.putpixel((0,0),(0))
          i.save("i.gif","GIF")
          

          【讨论】:

          • 只写import PIL,然后PIL.Image.new,是不是字符少了?看起来少了 5 个字符左右。
          • @chpwn。不起作用,因为 Image 不会自动在 PIL 的命名空间中
          【解决方案7】:

          Python+PIL 68 个字符

          from PIL import Image
          Image.fromstring("P",(1,1),"\0").save("B.gif")
          

          【讨论】:

            【解决方案8】:

            WBMP,5 个字节:

            00 00 01 01 00
            

            无法想象更小的东西

            【讨论】:

            • 警告:.wbmp 似乎是 WAP/WML 流产的一部分,并且不受流行的桌面浏览器(IE、Firefox、Chrome)的开箱即用格式支持 - 在HTML?
            【解决方案9】:

            Logo / Turtle 基本款,12 字节

            PENDOWN FD 1

            我不记得pendown 是否可以缩短为pd,如果可以,则将其缩短为 7 个字节。

            【讨论】:

            • 是的 pd 是一个有效的别名 :) 虽然默认徽标背景画布是黑色的,所以线条是白色的 ;)
            【解决方案10】:

            bash:31 个字符

            从互联网下载单个像素 gif 的脚本比单个像素本身的字节少...

            wget http://tinyurl.com/2w97dyo
            

            【讨论】:

              【解决方案11】:

              后记,29 个字节。不是真正的“单像素”,而是我的预览屏幕上的单像素。

              0 0 moveto .5 0 lineto stroke
              

              【讨论】:

                【解决方案12】:

                我以前使用的旧图像格式: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
                

                【讨论】:

                • 从第三行开始阅读描述了整个文件格式。没有神奇的数字,并且图像尺寸是从扫描线的解释中隐含的(如果图像是锯齿状的,参考实现会使额外的空间变黑)。
                【解决方案13】:

                Data URI,83 个字符

                data:image/gif;base64,R0lGODlhAQABAIAAAAAAAAAAACH5BAAAAAAALAAAAAABAAEAAAICTAEAOw==
                

                【讨论】:

                • 太棒了!我这将是最有用的答案。它可以用来代替图像文件来减少服务器请求。
                • 这里是白色版本。 data:image/gif;base64,R0lGODlhAQABAAAAACwAAAAAAQABAAACAkwBADs=
                • 还有透明版。 data:image/gif;base64,R0lGODlhAQABAJEAAAAAAP///////wAAACH5BAEAAAIALAAAAAABAAEAAAICVAEAOw==
                • @Joey:只有在只需要一次时才会减少,这对于您在问题中概述的用法可能并不常见。如果图片由 URL 引用,则只获取一次然后缓存。
                • @Marian: 0 个 1x1 图像的请求仍然少于 1 个请求。
                【解决方案14】:

                XPM,57 字节

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

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

                ! XPM2
                1 1 1 1
                . c #000
                .
                

                【讨论】:

                  【解决方案15】:

                  PBM 格式是一种黑白图形格式。

                  单个黑色像素的二进制表示需要 8 个字节,使用 C# 将其写入文件如下所示:

                  File.WriteAllText("p.pbm", "P4 1 1 ÿ");
                  

                  【讨论】:

                    【解决方案16】:

                    Unicode art 格式:

                    ·

                    【讨论】:

                    • 哦,我以为我发现了一个坏点。
                    • 即使在我的手机上,我也看到了一些抗锯齿。这表明 (1) 您提供了多个像素,并且 (2) 它并非全黑。
                    • 哇,两个字节,我认为你是赢家 :-)
                    • 我认为它是一个 3x3 的像素矩阵,其中只有一个是纯黑色的。不可能!
                    • Ascii 艺术格式:.(注意@ 也是 1 像素的有效 ascii 艺术表示)。
                    【解决方案17】:

                    图片文件:10字节PGM格式:

                    P5 1 1 1\n\0
                    

                    要创建它,在 Python 中:40 个字符

                     open('b.pgm', 'w').write('P5 1 1 1\n\0')
                    

                    【讨论】:

                    • 看起来是标准格式的赢家。不过,我在 DOS 时代的旧绘图程序已经被你打败了。
                    • 从未听说过这种格式,但这会做同样的事情:perl -e 'print "P5 1 1 1\n\0"' &gt; b.pgm 29 个字符
                    猜你喜欢
                    • 1970-01-01
                    • 2010-12-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-11-28
                    相关资源
                    最近更新 更多