Why is Text in an Image cut off?

I want to create a long, skinny Image containing only text.

This makes a square image of the default size.

Image@Graphics[
{
FontSize->20,
Text[“now is the time for all good men to come to the aid of their country”]
}
]

So I prescribe the dimensions I want:

Image@Graphics[
{
FontSize->20,
Text[“now is the time for all good men to come to the aid of their country”]
},
ImageSize->{1000,30}
]

and the result is cropped well inside the ImageSize so some of the text is missing. But the Graphics alone is appearing correctly.

Graphics[
{
FontSize->20,
Text[“now is the time for all good men to come to the aid of their country”]
},
ImageSize->{1000,30}
]

Why does Image mysteriously crop the input?

=================

  

 

Why not Style[Text[ “now is the time for all good men to come to the aid of their country”], FontSize -> 20]//Rasterize ?
– Rod
Jul 11 ’13 at 18:30

  

 

I believe this issue has been covered before but I cannot find the question. Please help me look for it. @RodLm : Probably because he has other Graphics primitives in practice.
– Mr.Wizard♦
Jul 11 ’13 at 18:52

  

 

You need to apply the ImageSize to Image, not Graphics. Try Image[Graphics[Text[Style[“now is the time for all good men to come to the aid of their country”, 20]]], ImageSize -> {600, 30}]
– m_goldberg
Jul 11 ’13 at 18:58

  

 

@m_goldberg I believe this question has been asked before; can you help me find it?
– Mr.Wizard♦
Jul 11 ’13 at 19:42

  

 

@Mr.Wizard. I wouldn’t be surprised if it were so, but a half=hour of searching didn’t turn up anything. Sorry.
– m_goldberg
Jul 11 ’13 at 20:21

=================

2 Answers
2

=================

Image defaults to a certain size, but can be adjusted with its own ImageSize.

g=Graphics[{FontSize -> 20, Text[“now is the time for all good men to come to the aid of their country”]};
Image[g, ImageSize -> {1000, 30}]

  

 

it seems you need to manually work out the aspect ratio..?
– george2079
Jul 11 ’13 at 23:56

a bit of tweaking..

rastertext[ht_] := Function[{s}, Module[{},
(*ht=approx pixel ht of M*)
ImageCrop@
Image[Graphics[{{FontSize -> 1.5 ht, Text[s]}}],
ImageSize -> 5 ht { StringLength[s] , 1}]]]

the trick here is to scale the fontsize with the desided height, give ample room in the imagesize, then crop the result

z1 = rastertext[18]@(StringJoin @@ Table[“M”, {20}] )
z2 = rastertext[18]@(StringJoin @@ Table[“M”, {5}] )
z3 = rastertext[18]@(StringJoin @@ Table[“M”, {1}] )

verify we got the height right

ImageDimensions /@ {z1, z2, z3}

(* {{480, 18}, {120, 18}, {24, 18}} *)

rastertext[18]@”now is the time for all good men to come to the aid of their country”

for fun..

words = rastertext[18] /@
StringSplit[
“now is the time for all good men to come to the aid of their country”];
p = {0, 0};
Graphics[Last@Last@Reap[
Do[d = ImageDimensions[w]; Sow[Inset[w, p, {0, 0}, d]];
p += {d[[1]] + 15, 0};
If[p[[1]] > 300, p = {0, p[[2]] – 30}], {w, words}]],
PlotRange -> {{0, 350}, {-60, 25}}]

..need more tweaking to get the baselines aligned..

rastertext[ht_] := Function[{s}, Module[{},
(*ht=approx pixel ht of M*)
pad = If[ Length[StringPosition[s, {“g”, “q”, “p”, “y”, “j”}]] == 0 , ht/3, 0];
ImagePad[ ImageCrop@
Image[Graphics[{{FontSize -> 1.5 ht, Text[s]}}],
ImageSize -> 5 ht { StringLength[s] , 1}], {{0, 0}, {pad, 0}},White]]]