Forum: Ruby Display Text as Image

Posted by Adriana Mikolaskova (mikolaskova)
on 2012-11-04 17:17
Hello,

I have a String, which I want to display as a bitmap image. What is the
best way to do this?

I tried f.e. the code below (RMagick), but the image displayed did not
contain the whole Text I stored in the variable myText. What can I do to
get the whole text displayed in an image? Or is there another, better
approach to do this?

Best Regards

Adriana

img = Image.read("caption:"+myText) do
         self.size = "2000"
         self.height=1000
         self.pointsize = 20
        self.font = "Tahoma"


       end

img[0].display
Posted by Carlo E. Prelz (Guest)
on 2012-11-04 21:47
(Received via mailing list)
Subject: Display Text as Image
  Date: Mon 05 Nov 12 01:17:13AM +0900

Quoting Adriana Mikolaskova (lists@ruby-forum.com):

> Best Regards
>        end
I am not sure I understand what you would like to obtain.

Here is the way to create a RMagick Image object, composed of given 
pixels
passed in a string:

def make_image(x,y,pixels)
  im=Magick::Image::new(x,y)
  im.import_pixels(0,0,x,y,'RGB',pixels)
  im
end

The string must be made up of x*y*3 bytes - the RGB values for each
pixel.

But from your example, it seems that you want to make an image which
includes a given message (characters to be read). This requires
something more complex:

def make_image_with_text(x,y,backg_col,foreg_col,text,font,pointsize)
  im=Magick::Image::new(x,y) do
    self.background_color=backg_col
  end
  gc=Magick::Draw::new()
  gc.annotate(im,x,y,0,0,text) do
    self.font_family=font
    self.fill=foreg_col
    self.stroke=foreg_col
    self.pointsize=pointsize
    self.gravity=Magick::CenterGravity
  end
  im
end

To have a 2000x1000 black image with "This is a test" written in
20point Tahoma in red in it you should call the above as follows:

im=make_image_with_text(2000,1000,'black','red','This is a 
test','Tahoma',20)
im.display

Of course you can do the two things in sequence - first draw some
pixels, and then superimpose some text...

Have a look at

http://studio.imagemagick.org/RMagick/doc/draw.html#annotate

Remember to destroy Image objects after using them, with

im.destroy!

Otherwise they are not garbage-collected, and if you generate many
images you soon end up with a full ram...

Carlo
Posted by Adriana Mikolaskova (mikolaskova)
on 2012-11-04 21:57
Thank you very much for the detailled description and the code!!!it was 
the second I'm looking for!
Posted by Adriana Mikolaskova (mikolaskova)
on 2012-11-05 21:51
Hello,

your code worked fine for me, just one little problem occured.
When there are no linebreaks in the text, all the text is displayed on 
one line (that means invisible).

I found different solutions, just wanted to ask here: is it really 
necassary to figure out, how many characters a image-with can hold and 
insert the line-breaks in the text? Or did I miss some easier method for 
inserting line-breaks at the end of the image-width?

Best regards

Adriana
>
> def make_image_with_text(x,y,backg_col,foreg_col,text,font,pointsize)
>   im=Magick::Image::new(x,y) do
>     self.background_color=backg_col
>   end
>   gc=Magick::Draw::new()
>   gc.annotate(im,x,y,0,0,text) do
>     self.font_family=font
>     self.fill=foreg_col
>     self.stroke=foreg_col
>     self.pointsize=pointsize
>     self.gravity=Magick::CenterGravity
>   end
>   im
> end
>
> To have a 2000x1000 black image with "This is a test" written in
> 20point Tahoma in red in it you should call the above as follows:
>
> im=make_image_with_text(2000,1000,'black','red','This is a
> test','Tahoma',20)
> im.display
>
> O
Posted by Carlo E. Prelz (Guest)
on 2012-11-06 08:10
(Received via mailing list)
Subject: Re: Display Text as Image
  Date: Tue 06 Nov 12 05:51:21AM +0900

Quoting Adriana Mikolaskova (lists@ruby-forum.com):

> your code worked fine for me, just one little problem occured.
> When there are no linebreaks in the text, all the text is displayed on
> one line (that means invisible).
>
> I found different solutions, just wanted to ask here: is it really
> necassary to figure out, how many characters a image-with can hold and
> insert the line-breaks in the text? Or did I miss some easier method for
> inserting line-breaks at the end of the image-width?

From what I know, no. Note that, for fonts that are not monospaced, it
is not simply a question of how many characters, because glyphs may
have different widths.

You can split your phrase in words, add one word at a time, measure
the width (with get_multiline_type_metrics) and insert a newline
before the word that would overflow. Not very difficult, but as far as
I know there is nothing pre-made in Magick.

Carlo
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.