Tell me more ×
Programming Puzzles & Code Golf Stack Exchange is a question and answer site for programming puzzle enthusiasts and code golfers. It's 100% free, no registration required.

So, I want you to make a PNG image that says "Hello world!" and nothing else on a distinguishable background using only an image making API (eg ImageMagick) and return the image. Fewest characters win, as usual. Oh, and you can use any color text.

share|improve this question
 
Does it have to output Hello World or Hello World!? –  Ryan Carlson 2 days ago
2  
@ryan Hello World! is the right one. –  user2758631 2 days ago
2  
A lot of answers could save one character by replacing the double 'l' in 'hello' with the medieval Welsh ligatures 'Ỻ' or 'ỻ': once the chars have been transformed to pixels it shouldn't matter what their origin was as long as people still perceive 'heỻo world!' as 'hello world!'. –  timxyz yesterday
4  
@poldie Your browser changes PNG based on how the pixels got in there? –  Christopher Creutzig yesterday
1  
@timxyz For me, ỻ is rendered as a box containing 1EFB. I tried to use it in my program anyway, and the result was a square. So, this is probably not very portable. –  Victor 21 hours ago
show 3 more comments

39 Answers

Bash + ImageMagick: 35 33

Default font, default text size, default colours:

convert label:Hello\ world! a.png

and here's the result:

Hello, World!

Thanks to DigitalTrauma and sch for the help :-D

share|improve this answer
13  
Great!! :-) I wanted to write something like that. Unbeatable! All the esoteric languages will finally get their ass kicked today! :-) –  Tomas Feb 1 at 20:57
1  
You can shave off one char by using single-quotes: convert 'label:Hello world!' a.png –  DigitalTrauma Feb 1 at 22:05
6  
convert label:Hello\ world! a.png is even shorter. –  sch Feb 1 at 22:10
4  
Also, if you make it sh, you don't have to worry about ! and you make it even less esoteric. –  sch Feb 1 at 22:17
3  
Frankly I don't think bash qualifies as a programming language here or that convert qualifies as an API. But in this case I'd throw GNU hello in and bring this contraption down to 29 with: convert label:"`hello`" h.png –  Arnaud Meuret 17 hours ago
show 7 more comments

Mathematica 28 27

This creates and exports the sentence, "Hello world!", as a PNG image. 1 char saved by Mechanical snail.

".png"~Export~"Hello world!"

Testing

This imports the PNG image. The image was enlarged by dragging the image box handles.

png

share|improve this answer
3  
27 bytes: ".png"~Export~"Hello world!" –  Mechanical snail 2 days ago
add comment

C# - 168 chars

C# is better! ;)

using System.Drawing;class a{static void Main(){var s=new Bitmap(99,9);Graphics.FromImage(s).DrawString("Hello world!",new Font("",5),Brushes.Red,0,0);s.Save(".png");}}

Saves as .png in the current directory.

Rule abuse:

  • Minimum font/image size has not been specified, so I settled for the minimum readable ;)
  • Filename is empty (only extension!), but it works flawlessly.

To mirror the Java answer, here is the indented code:

using System.Drawing;
class a
{
    static void Main()
    {
        var s = new Bitmap(99, 9);
        Graphics.FromImage(s).DrawString("Hello world!", new Font("", 5), Brushes.Red, 0, 0);
        s.Save(".png");
    }
}

.net's API is a lot cleaner.

share|improve this answer
 
Thanks for the suggestion of making the file call just .png. :) –  Victor Feb 1 at 22:08
 
I don't see how this is much cleaner than the Java one. –  immibis 2 days ago
 
It is much cleaner than the Java one. –  user-12506 yesterday
3  
@immibis I can point the following: Character count is 28% lower, because of: no checked exceptions(throws Exception); the var keyword; Save is a method of the image itself, in contrast to javax.imageio.ImageIO.write(b...; file type is automagically inferred from the extension, no need to specify a separate "png"; No need to instantiate a File object as in new java.io.File("p"); Main method doesn't need to receive a parameter. The general idea is the same: create an image, use Graphics to write to it, and save it - but here it is done with more clear and succint method calls. –  NothingsImpossible yesterday
 
But C# doesn't have wildcards in generics. And anonymous classes. And return type covariance. And some other things I'm too lazy to recall. –  Sarge Borsch 3 hours ago
add comment

HTML, 1494

I know this won't win, but I didn't see this here before.

Anchor link

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAANEAYAAABNymQSAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAABCAAAADQDi7GgjAAADvElEQVRYw+1YPa9pTRReRIJKEPHdiEJBoVVIRCenpCJBfCQEDeI3qAh/QCIRUchp0KCUaISgROO7QMRHSGS9xX73u+85592Xe47uepqJZ9bMrFnzrJm1MfBfwAsvAADzM8HhcDgczv2Bj9r9KRgMBoPBeJz/2/DdODwaV+bjU77wN+AliBc+4OmCmE6n0+kUwGKxWCwWAKFQKBQKAfR6vV6vBygWi8Vi8efr7Ha73W4H4HK5XC4XgFQqlUqlADKZTCaTAbjdbrfbTdndg8FgMBgMANVqtVqtUnwikUgkEgBisVgsFgOQFRfZkny/3+/3+z/3i7zC8/l8Pp8HkEgkEomE3u/tdrvdbgEcDofD4aDirVar1Wo1QCaTyWQyj8f1iyAul8vlcqEco2tJu88IBoPBYBDA7/f7/X6A5XK5XC4ByuVyuVwGSCaTyWQSYDAYDAaD7wsiHo/H43EAFovFYrEAxuPxeDwGGI1Go9GI4skDvYe3t7e3tzeAer1er9cpvtlsNptNAC6Xy+VyAYbD4XA4pPwnea1Wq9Vqn+dXu91ut9sAjUaj0WjQ28VisVgsRgl0MplMJhOAXq/X6/UAOp1Op9OhH8/j8Xg83i8EfgKbzWaz2XgXdHYCgUAgEJBfLfQtkQFfx/+/V195uVwul8sRV6vVarX6ak8IEVGpVCqVyvv7IQKISBwsIpHBiBqNRqPRIBIHiJhOp9PpNGIqlUqlUoihUCgUCj3PL3Kf6/V6vV7fjwNxAyEuFovFYvHVnuTp4moymUwmE/Wb9f0c/b3iut1ut9sFIDZO9c9ms9lsBsDn8/l8/s/Xu1c932632+12fx6dTqfT6QD2+/1+vwcolUqlUgnAaDQajUYAs9lsNpsBstlsNpulMjISiUQikef7JRKJRCLRfb+ZTCaT+ZuH/95XCflU/odHM/9Ru3A4HA6HEaPRaDQaRbxer9frFbHVarVaLURCMFSm3MsAOt7j8Xg8HkSfz+fz+RDP5/P5fEY8nU6n0wnR6/V6vV6qfRSBQCAQCFAZXCgUCoUC4vF4PB6PiMRBISoUCoVCgUg8nc/zi27/dP3kPHa73W63IxKCRjwcDofDAZGoWejnrdVqtVrtl/mfLQiiyEG02Ww2m416QogiB/H9/f39/f3xDdPx5DpOp9PpdCISxRfVkjxp9ygqlUqlUqHWm8/n8/mc6ievWKvVarVa6ff/Xb/+VBCbzWaz2VCCIOOtUqlUKhViLpfL5XKPx5XxseOFvx2v/yFe+ICXIF74gH8A5ia8gOmPT18AAAASdEVYdGxhYmVsAEhlbGxvIHdvcmxkIbl+3UEAAAAASUVORK5CYII=

Well apparently StackExchange will not allow data links so you must copy & paste it into your browser's address bar.


@squeamish ossifrage got it down to 176:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAHAQAAAAC0VvlnAAAAOklEQVR4nGLIv/57/+9rDGDqAkPOterN0YIM3KG712pdZcgI3bW26gZD9lUwlRNWW1wtAAAAAP//AwCcyhjs3+7tWQAAAABJRU5ErkJggg

share|improve this answer
 
5  
You can easily compress this to 258 characters: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAANCAAAAAA4MeeNAAAAdklEQVR4A‌​c2QUQqFQAwDc9I5Ze6XB8HXXRFE8Mdg+zGEwa7yOurXdUb30ap+UIHkUSDRGg5K5D+SdRQ8iqbdTjmk04‌​3ihcQU9r8Y1aEY2A2Y1cte4KRIc1UYg58oIFYuhwQ5UgYp+yF+8Jz1Qgapsz/n23xE8QNxUbxuz+WqjAA‌​AAABJRU5ErkJggg== pastebin.com/5TQzNv3D –  MMM yesterday
2  
@squeamish ossifrage got it down to 176: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAHAQAAAAC0VvlnAAAAOklEQVR4n‌​GLIv/57/+9rDGDqAkPOterN0YIM3KG712pdZcgI3bW26gZD9lUwlRNWW1wtAAAAAP//AwCcyhjs3+7tWQ‌​AAAABJRU5ErkJggg. Must strip the hidden spaces. –  Chloe 23 hours ago
 
166 chars: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAAAFAQAAAADaxQm5AAAAM0lEQVQIW‌​2Mo0a+w3iKQz8NQ+r56r+71/BIGlnwg40J+GUhkz9lr78sYShQ57O6IKfIAAJypEkNzAX3zAAAAAElFTk‌​SuQmCC codegolf.stackexchange.com/a/19941/12800 –  MMM 17 hours ago
1  
143 chars: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAEAQAAAAAhFcs9AAAAIElEQVQIHW‌​OJit1f7szy58v9DAWWPaEMP7hZHHgi1aMBegAI03/J+AQAAAAASUVORK5CYII= –  BenR 16 hours ago
add comment

Linux shell + various utilities: 48 bytes

My first thought was to print Hello World! in the console, and then take a screenshot (after a small delay to avoid the race condition) using scrot:

echo Hello World\!;scrot -d1

(28 bytes). Unfortunately, this fails the "and nothing else" requirement: it will generally show other things like window decorations.

So instead, do it inside a full-screen xterm. This covers up any other windows and hides window decorations. It also satisfies the background-color requirement, since xterm defaults to a white background.

Because xterm displays a black cursor, we also need to tell it to hide the cursor. That can be accomplished using a terminal escape sequence: ESC [ ? 2 5 l.

The option to make it full-screen is -fullscreen. However, it seems to work if you abbreviate the option to the shortest unambiguous possibility, -fu, saving 8 bytes.

The final code (48 bytes) is:

xterm -fu -e 'echo \x1b[?25lHello World!;scrot -d1'

(where \x1b denotes a literal ESC character, which takes 1 byte). By default, scrot writes the screenshot to a timestamped PNG file in the current directory.

It works on my system:

output

share|improve this answer
7  
+1 Nice tricks, can be useful in real life too. –  Erel Segal Halevi yesterday
 
You missed some scrot options - I often use -s (interactively select window), but in this case you can use -u to grab the current (focused) window only. –  bryn 7 hours ago
add comment

TI-BASIC, 22

Text(0,0,"HELLO WORLD!

White background. Use TI-Connect if you wish to retrieve it from the calculator. Resulting PNG:

enter image description here

share|improve this answer
2  
Why the downvote? Produces a .PNG image with the text HELLO WORLD! –  Timtech Feb 1 at 20:15
4  
While I don't know for definite, I'm going to assume that Ti-Connect generates and outputs the PNG here. –  slackwear Feb 1 at 20:22
7  
There's a PNG file on the calculator? –  slackwear Feb 1 at 20:29
13  
The calculator may have a 94 by 62 bitmap, stored in its own uncompressed format. I'll put my money on Ti-Connect converting it into a PNG when it's retrieved. –  Tobia Feb 1 at 23:00
16  
Can you post the resulting PNG? –  Victor 2 days ago
show 3 more comments

Java - 340 339 292 261 239 236 233 chars

This outputs a file just called p with a transparent background and white text:

import java.awt.image.*;class R{public static void main(String[]y)throws Exception{BufferedImage b=new BufferedImage(80,9,2);b.getGraphics().drawString("Hello World!",5,9);javax.imageio.ImageIO.write(b,"png",new java.io.File("p"));}}

Here a properly-indented version. Should be pretty clear what is going on:

import java.awt.image.*;

class R {
    public static void main(String[] y) throws Exception {
        // 2 = BufferedImage.TYPE_INT_ARGB
        BufferedImage b = new BufferedImage(80, 9, 2);
        b.getGraphics().drawString("Hello world!", 5, 9);
        javax.imageio.ImageIO.write(b, "png", new java.io.File("p"));
    }
}

You might argue that white text in a transparent background is awful for reading and the file being called just p without the .png extension is awful too. So this longer variant version with 290 chars use red text and outputs a file called p.png:

import java.awt.image.*;import java.awt.*;class R{public static void main(String[]y)throws Exception{BufferedImage b=new BufferedImage(80,9,2);Graphics g=b.getGraphics();g.setColor(Color.RED);g.drawString("Hello world!",5,9);javax.imageio.ImageIO.write(b,"png",new java.io.File("p.png"));}}

That properly-indented:

import java.awt.image.*;
import java.awt.*;

class R {
    public static void main(String[] y) throws Exception {
        // 2 = BufferedImage.TYPE_INT_ARGB
        BufferedImage b = new BufferedImage(80, 9, 2);
        Graphics g = b.getGraphics();
        g.setColor(Color.RED);
        g.drawString("Hello world!", 5, 9);
        javax.imageio.ImageIO.write(b, "png", new java.io.File("p.png"));
    }
}
share|improve this answer
1  
@user-12506 Yes, you can add throws Exception to other methods, but the compiler enforce this rule: if you call a method that might throw a Throwable that is not a RuntimeException or an Error, then the compiler will require that you either catch or rethrow it, and this includes Exception. Further, although it is allowed, declaring throws Exception is a bad programming practice, because Exception is way too generic to be effectively handled in practice and rethrowing it just spread the bad practice to elsewhere. –  Victor yesterday
1  
@user-12506 It's called checked exceptions. Look it up. :) –  ntoskrnl yesterday
1  
@user-12506 Not everything is lower case in Java – classes are CamelCase just like in C#. Methods and fields are lowerCamelCase, and packages are alllowercase. Makes it somewhat easier to determine what a name refers to, in my opinion. –  ntoskrnl yesterday
1  
@ntoskrnl Yeah, things can and do get a bit confusing when classes, methods and other things are camel case. But in the case of methods, it either begins with an Identifier that allows you to immediately recognize it as such, and if you're calling a method, you'll know right away that it's a method because it ends in (); or (somethinginHere);. In C#, most things are CamelCase (when I'm typing anyway), except for variables. and (most) types. Either way, I'm going to have to get used to Java eventually. I've just started my first serious Android project. –  user-12506 yesterday
2  
@Timtech, at least for me ỻ was rendered as a square in the resulting image. Here in the browser (using firefox), it renders as a box containing 1EFB. I strongly suspect that this is not portable. –  Victor 21 hours ago
show 10 more comments

Fortran 90, 104 bytes:

Aight, game on. Fortran 90, using the g2 graphics library and implict typing, so "d" is a real:

program p
d=g2_open_gd('h',80.,12.,g2_gd_png)
call g2_string(d,1,1,'Hello world!')
call g2_close(d)
end

Needs to have the g2 library installed, then just compile with

gfortran -lg2 -fsecond-underscore p.f90

I'm pretty satisfied that I beat C#, C + Cairo, Java, Javascript, Python and Ruby! Example output: example PNG produced by Fortran

share|improve this answer
 
This can be shortened to 93 characters by eliminating program p as it is not necessary (the only necessary part of a F90 code is end). –  Kyle Kanos 10 hours ago
add comment

Processing, 38 37

This might be considered cheating, but:

text("HeΠo World!",9,8);save(".png");

enter image description here


38 char solution:

text("Hello World!",9,9);save(".png");

Saves this image as .png:

enter image description here

share|improve this answer
add comment

R, 52 39 chars

png()
frame()
text(.5,1,"Hello World!")

Saves as Rplot001.png in current directory. To be run as a script in non-interactive (batch) mode.

Thanks to Sven Hohenstein and Michael Hoffman for updates!

share|improve this answer
 
I count 52 characters... –  Sven Hohenstein Feb 2 at 2:47
 
@SvenHohenstein sorry you are correct. I made a mistake while attempting shorter versions (they didn't work). –  Tomas 2 days ago
 
dev.off() is unnecessary when you run this as a script instead of interactively. –  Michael Hoffman yesterday
 
Thanks @MichaelHoffman! I credited you. –  Tomas 15 hours ago
add comment

C + Cairo: 238 221 202 bytes

#include <cairo/cairo.h>
main(){cairo_surface_t*s=cairo_image_surface_create(0,99,50);cairo_t*c=cairo_create(s);cairo_move_to(c,0,9);cairo_show_text(c,"Hello world!");cairo_surface_write_to_png(s,"o");}

$ cc `pkg-config cairo --libs --cflags` mini.c && ./a.out && display o

Here is the un-minified version:

#include <cairo/cairo.h>
void main (int argc, char* argv[])
{
    cairo_t *cr;
    cairo_surface_t *surf;
    surf = cairo_image_surface_create (0, 99, 50);
    cr = cairo_create (surf);
    cairo_move_to (cr, 0, 9);
    cairo_show_text (cr, "Hello world!");
    cairo_surface_write_to_png (surf, "out.png");
}

Best enjoyed while listening to this song :)

share|improve this answer
 
You can save some chars by removing the type declaraction, i.e. the void for main and the int for x, and possibly the char for **a (I'm not sure about the last one though). In C the type is default to be int if no type is specified, and you don't necessarily need to return a value for int main. This may produce compilation warning messages, but not errors and the program will still work. –  ace 2 days ago
1  
Shaved 17 bytes by removing the pointless #define C(n,...) …. Also, main returns int, not void (and as of C99 it's not required to explicitly "return 0" at the end of main; the implementation implicitly adds it for you). –  Quuxplusone 2 days ago
 
@ace Thank you! I had forgotten that types defaults to int i C. But it looks like it's all-or-nothing; you can't have some variables in the call signature use default types while others don't. So I just changed it to main() and hardcode the filename to o instead of passing it to main. Now it's smaller than the Java version :) –  Torkel Bjørnson 2 days ago
 
@Quuxplusone Thanks! Did not know that C99 add an implicit return 0 to main if not already there. That was why I choose to (incorrectly) return void instead of int. Since you got rid of the vararg macro, C99 is not required to compile the code anymore. <rant>Which makes it more portable to compilers who's vendors has chosen to not implement C99 [read: Microsoft] :)</rant> –  Torkel Bjørnson 2 days ago
add comment

make a PNG image that says "Hello world!" …

You'll hopefully excuse my very loose interpretation of the above requirement. :)

OSX bash:

printf '"Hello world!" and nothing else on a distinguishable background using only an image making API (eg ImageMagick) and return the image.' > hello.png
say -f hello.png
share|improve this answer
 
But it's not a PNG image, is it? –  Ruslan 16 hours ago
1  
Well, it's technically a .png file, and it does say what is needed. :-) –  Denis 15 hours ago
 
PNG image is not "ASCII text, with no line terminators", as said by file. It's a .png file, but not PNG image. –  Ruslan 15 hours ago
1  
Fail point. I didn't manage to find a way to fool the file utility by pre-pending the whole thing with the relevant code (i.e. decimals 137 80 78 71 13 10 26 10). Perhaps you might know of a way? ;-) –  Denis 14 hours ago
 
seems you'd need to make full header with all information like dimensions, palette etc., because file prints this information. With your relevant code it only says "data". –  Ruslan 12 hours ago
add comment

BASH + RST + ImageMagick = 43 chars

Just for fun, here's another (quite ugly) one:

echo 'Hello World!'|rst2pdf|convert - a.png

Output:

Hello World!

share|improve this answer
add comment

PHP + gd2 - 86 bytes

<?imagestring($i=imagecreatetruecolor(97,16),4,2,0,'Hello world!',65535);imagepng($i);

imagecreatetruecolor is used instead of the shorter imagecreate, because colors can used directly without having to allocate them with imagecolorallocate. 65535 corresponds to hex color #00FFFF, a.k.a. cyan. I could have used 255 for blue, but it's fairly hard to see on a black canvas.


If the requirement that the background must be white or transparent is to be strictly enforced, I think the best that can be done is 98 bytes:

<?imagestring($i=imagecreatetruecolor(97,16),4,2,0,'Hello world!',imagefilter($i,0));imagepng($i);

The 0 sent to imagefilter is the value of the constant IMG_FILTER_NEGATE, which of course negates the image. The result, 1, is then used as the paint color (#000001):


Another option at 108 bytes:

<?imagestring($i=imagecreatetruecolor(97,16),4,2,imagecolortransparent($i,0),'Hello world!',1);imagepng($i);

Setting black to be transparent, and drawing with #000001 instead.


PHP + No Library - 790+ bytes

<?
echo pack('CA3N2',137,'PNG',218765834,13);
echo $ihdr = pack('A4N2C5','IHDR',45,7,1,0,0,0,0);
echo hash('crc32b',$ihdr,true);
$data =
  '--------0  0      0 0                        0    0 0---'.
  '--------0  0      0 0                        0    0 0---'.
  '--------0  0  00  0 0  00    0   0  00  0 0  0  000 0---'.
  '--------0000 0  0 0 0 0  0   0   0 0  0 00 0 0 0  0 0---'.
  '--------0  0 0000 0 0 0  0   0 0 0 0  0 0    0 0  0 0---'.
  '--------0  0 0    0 0 0  0   0 0 0 0  0 0    0 0  0  ---'.
  '--------0  0  000 0 0  00     0 0   00  0    0  000 0---';
$bytes = join(array_map(chr,array_map(bindec,str_split(strtr($data,' -',10),8))));
$cmp = gzcompress($bytes);
echo pack('N',strlen($cmp));
echo $idat = 'IDAT'.$cmp;
echo hash('crc32b',$idat,true);
echo pack('NA4N',0,'IEND',2923585666);

Ahh, that's better. No bloat; exactly as much as required, and not a chunk more.
The result is this 109 byte png:

Or, URI encoded (which seems to be trending...) at 168 bytes:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAHAQAAAAC0VvlnAAAANElEQVR4nGPIv/7//+8LDFAq51r15mgBBu7Q3Wu1LjBkhO5aW3WBIfsqkLrBkBNWW1wtAACw2RlgLInRogAAAABJRU5ErkJggg

Supposing we wanted to cut that down a bit more, let's say we replace the data string with this:

$data =
  '--------0  0      0 0                    0   0 0'.
  '--------0  0  00  0 0 000   0   0 000 00 0 000 0'.
  '--------0000 0 00 0 0 0 0   0 0 0 0 0 0  0 0 0 0'.
  '--------0  0 00   0 0 0 0   0 0 0 0 0 0  0 0 0  '.
  '--------0  0  000 0 0 000   00 00 000 0  0 000 0';

(and update the header to the new dimensions, 40x5), the output would be this 96 byte png:

Which URI encodes to 150 bytes:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAFAQAAAAAft5MoAAAAJ0lEQVR4nGPIv/7//y6GnCvlLosYuEJLQ1cxZF4tDV3NkBNS5LoIANqBDTt5Av0NAAAAAElFTkSuQmCC

I think that's about as small as you're going to be able to get, and still be considered "human readable".

share|improve this answer
 
The question state that it should have a white or transparent background. I myself think that the rules should be relaxed to allow black too, but for now, it fails the spec at this point. –  Victor 2 days ago
 
@Victor Unfortunately, the gd2 library - as exposed by PHP, at least - doesn't have an option to specify the default color. Setting black to be transparent does work, though. Or simply to negate the entire image before adding the text. –  primo 2 days ago
add comment

Octave, 46

Is this legal? Does not conform to the "nothing else" requirement... it has a coordinate system too.

figure
title("Hello World!")
print -dpng x.png
share|improve this answer
add comment

Javascript! 105

c=document.createElement('canvas');
c.getContext('2d').fillText('Hello world!',0,9);
location=c.toDataURL()

Outputs this size-optimized and pretty image:

Hello world!

share|improve this answer
add comment

Ruby, 138

I'm golfing this hole with just my putter. (I chose a PNG library without fonts or a string draw method.)

require'chunky_png';i=ChunkyPNG::Image.new 34,4
136.times{|v|i[*(v.divmod(4))]=9*(0xb0fae0f02e0eae0ece00eae0f0f0bf0f2f&1<<v)>>v};i.save ?h

Actual output is 34x4 pixels. (Enlarged below.) This plots very, very small and nearly transparent hand-drawn chars onto a very small transparent background. Image is saved to a PNG file named h.

output

share|improve this answer
 
Would it be shorter in Ruby to store 0xb0... in Base64 and call a decode function? –  Mechanical snail 2 days ago
1  
@Mechanicalsnail, I think that would require another require and then some, so the savings would be blown. I think. I did look at Base 36 (since that can be done with to_i alone) but that ends up a bit longer. –  Darren Stone 2 days ago
add comment

Data URI: 446

Following Chloe's idea, applied some basic optimisation to the image.

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAAALCAAAAAAFX7+TAAABBUlEQVQoz2P4Tylg+M8IohiRRUCIkC6E0sFlwhFBJo5kmPAdWSYmuTsgGa6y/3pMf/8yLYEJMcQwARXckmZi8YCawAAG//8L537ZxbEMaoKCwuvXCkogE2y0/nMyL1vC/BcmxKC6AqhAXurBc1kGkNUINzCBDIqFmsB84f//c8wgmcVs91j13d3U4EIMl0AKmM78/38GqJQXyQSWQ///H3sJMwGo7ALYhL/MQUq1wkK1cCEGsE+ZgSacAzKNkUxQ1/kygfEczBeKb18rKICDS4U58SUT8ye4EMQEBelHz+WAzEokE+6IM7HkI4ekLDgk/5cxnPrPK/4fLgQxARSSUdCQpBQAAFZKE8rQG60FAAAAAElFTkSuQmCC

Might be able to hack it further, but then would not be a perfectly conformant PNG and some viewers may not display it correctly.

share|improve this answer
 
Could you explain what kind of optimizations did you perform? –  svick yesterday
 
PNG2, stripped optional chunks, optimal (not streamed) compression –  OrangeDog yesterday
1  
If you reduce the font size slightly, remove the spacing, the actual binary size of the image would be smaller than some of the posted solutions. –  OrangeDog yesterday
1  
@OrangeDog I got it down to 179: data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAHAQAAAAC0VvlnAAAAOklEQVR4n‌​GLIv/57/+9rDGDqAkPOterN 0YIM3KG712pdZcgI3bW26gZD9lUwlRNWW1wtAAAAAP//AwCcyhjs3+7tWQAAAABJRU5ErkJggg== –  squeamish ossifrage yesterday
1  
@squeamishossifrage That doesn't load in Firefox for me. –  OrangeDog yesterday
show 5 more comments

Python with PIL 122 Chars

from PIL import Image,ImageDraw;d=Image.new("RGB",(66,10));i=ImageDraw.Draw(d);i.text((0,0),"Hello World");d.save("a.png")

It could probably be much smaller but I haven't worked with PIL extensively and made this in 5 minutes.

Output: enter image description here

share|improve this answer
2  
You beat me to it by 10 minutes! With about 10 less chars! +1 :D Lose another char by going from 10 to 9 in your new, but you left out the !. –  Aaron Hall Feb 2 at 1:29
 
The question state that it should have a white or transparent background. I myself think that the rules should be relaxed to allow black too, but for now, it fails the spec at this point. –  Victor 2 days ago
2  
Couldn't you save lots of characters with from PIL import*? –  Timtech yesterday
add comment

Ghostscript command line incantation, 84 (i.e. Postscript) :

 gs -sDEVICE=png16 -oa.png -c '/ 72 selectfont 9 9 moveto(Hello world!)show showpage'

Missing font message is intentional ;-). And proper (i.e. not hidden) name for our PNG file, too :-)

share|improve this answer
add comment

Python and Matplotlib - 66 65 chars

from pylab import*;title('Hello world!');axis('off');savefig('X')

Bit of whitespace, but it has the text and nothing else. File is saved as X.png:

enter image description here

share|improve this answer
 
from pylab import* –  Timtech yesterday
 
@Timtech thanks, I'm a golfing noob clearly ;) –  Nick T yesterday
 
I think you did a great job! –  Timtech yesterday
add comment

Gnuplot

Not really a true competitor, just for fun. (homepage)

#!/usr/bin/gnuplot
set terminal pngcairo
set output "hw.png"
set label "Hello\nWorld!"
unset xtics
unset ytics
set yrange [-1:+1]
plot -1 notitle
share|improve this answer
1  
You can shorten each of those commands to the minimum unique stub - so set te works, and set out etc. And you only need the top line to make it executable in the terminal, which is not a usual code golf requirement. So: se te pngc;se ou "q.png";se la "Hello world!";se yr[-1:1];uns ti;pl -1 not - 74 chars –  Phil H 10 hours ago
add comment

Perl, 95:

The whole command incantation:

perl -MGD::Simple -e'$i=new GD::Simple;moveTo$i 9,50;string$i "Hello world!";print$i->png'>.png

Because of (reasonable) module defaults, it's 95 characters (or 92 if single letter file name allowed).

On Windows we need to binmode STDOUT, the shortest way I think can be -M-encoding+ get rid of double colons:

perl -MGD'Simple -M-encoding -e"$i=new GD'Simple;moveTo$i 9,50;string$i 'Hello world!';print$i->png">.png

i.e. 105

enter image description here

share|improve this answer
add comment

Python, with 118 115 117 116 114 chars

Here's a full criteria passing with white text on alpha background at 116 114 chars!:

from PIL import Image,ImageDraw as D;m=Image.new("LA",(99,9));D.Draw(m).text((9,0),'Hello World!');m.save('r.png')
share|improve this answer
 
ImageDraw as D, and then D.Draw saves 3 chars. –  primo Feb 2 at 3:02
 
Done Thanks! :D –  Aaron Hall 2 days ago
 
The question state that it should have a white or transparent background. I myself think that the rules should be relaxed to allow black too, but for now, it fails the spec at this point. –  Victor 2 days ago
 
Done! It should pass now! –  Aaron Hall 2 days ago
add comment

dot, 35

Golfed Hans Zauber's solution:

dot -Tpng<<<'graph{"Hello World!"}'
share|improve this answer
 
That's not legal, as it plots an ellipse... –  Hans Zauber yesterday
add comment

Bash + DOT, 46 41

dot -Tpng<<<'graph{label="Hello World!"}'

This outputs a png into the standard output. It is saving a file, but I don't think that was a requirement.

Outout: Hello World!

share|improve this answer
 
I we allow them be in ellipses, it can be 8 chars shorter... –  Hans Zauber 2 days ago
1  
I am not sure whether you should add the bash chars as well for compiling this dot script. This adds dot -Tpng -op d, which is 15 chars. –  Hans Zauber 2 days ago
 
You should count the command line options/argument if they are needed to make your program solve the task. Normally the dashes are not counted, so I think you only should add Tnpg, op and d to the character count (+7), and specify how to run it in the answer itself. –  daniero 2 days ago
 
It can be better if you don't echo but instead write it in a file and run dot -Tpng on the file; it makes it 38, but I don't know if it counts... –  Hans Zauber 2 days ago
 
Why would it not count? –  daniero 2 days ago
show 2 more comments

PureBasic - 128 chars

UsePNGImageEncoder()
CreateImage(0,99,24)
StartDrawing(ImageOutput(0))
DrawText(0,0,"Hello World!")
SaveImage(0,"a.png",4673104)

enter image description here

Not the shortest here, but I have to support my favorite Basic language :)

edit: just in case there is a complain about the black background, at 133 chars:

UsePNGImageEncoder()
CreateImage(0,80,16)
StartDrawing(ImageOutput(0))
DrawText(0,0,"Hello World!",0,-1)
SaveImage(0,"a.png",4673104)

enter image description here

share|improve this answer
add comment

Sage notebook, 22

text("Hello world",0j)
share|improve this answer
 
Does this produce a PNG image? –  Timtech yesterday
 
Yup. That's why I specified 'notebook', the CLI pops a window open, but the notebook saves a .png for the browser to display. –  boothby 20 hours ago
add comment

EPL, 28

0,0,0,1,1,1,N,"Hello World!"
share|improve this answer
1  
Can you show the output? –  Ryan Carlson 13 hours ago
add comment

Matlab: 47 characters

I'm not sure what exactly an Image making API is. This uses a figure/graph making API, which is arguably an image.

text(1,1,'Hello World!');axis off;print -dpng f

Matlab example

share|improve this answer
add comment

protected by Community 4 hours ago

This question is protected to prevent "thanks!", "me too!", or spam answers by new users. To answer it, you must have earned at least 10 reputation on this site.

Not the answer you're looking for? Browse other questions tagged or ask your own question.