masynchin

masynchin

Need help with :egd

I currenly learning Elixir and want to manipulate images with it. I use :egd to calculate sizes of text image that I will render.

My code produces this error:

** (MatchError) no match of right hand side value: []
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_font.erl:62: :egd_font.glyph/2
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_render.erl:601: :egd_render.text_intervals/5
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_render.erl:339: :egd_render.precompile_objects/1
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_render.erl:317: :egd_render.precompile/1
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_render.erl:39: :egd_render.binary/2
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd.erl:239: :egd.loop/1

My code:

defmodule ImageText do
  @moduledoc """
  Documentation for `ImageText`.
  """

  def main() do
    render_text("hello")
  end

  def font() do
    :egd_font.load("lib/fonts/font.wingsfont")
  end

  def render_text(text) do
    {image_width, image_height} = calculate_text_size(text)
    image = :egd.create(image_width, image_height)
    :egd.text(image, {0, 0}, font(), String.graphemes(text), :black)
    :egd.save(:egd.render(image), "lib/image.png")
    :egd.destroy(image)
  end

  def calculate_text_size(text) do
    {font_width, font_height} = :egd_font.size(font())

    {font_width * String.length(text), font_height}
  end
end

lib/fonts/font.wingsfont.ttf is https://github.com/erlang/egd/blob/master/priv/fonts/6x11_latin1.wingsfont

Most Liked

christhekeele

christhekeele

Welcome to the forum!

It looks like the examples for :egd.text/5 use the erlang string type (the double quote literal). This is shorthand for what Elixir calls a charlist, so that is what you will need to convert your binaries into. But you need to be using this for all your string input:

  • "lib/fonts/font.wingsfont"
  • text
  • "lib/image.png"

Additionally, you are using a literal atom :black. The erl guides actually use an erlang variable for this, Black = egd:color({0,0,0}) (lowercased barewords are atom literals in erlang, uppercase is variables). So I would replace the atom with :egd.color({0,0,0}).

masynchin

masynchin

Very thanks, now it works!
this should be rendered image, but I not allowed to upload it :grin:

epilgrim

epilgrim

I’m afk, so I cannot check this, but have you tried using charlists instead of a bynary when calling load?
that would be changing the quotes to :egd_font.load(‘lib/fonts/font.wingsfont’)
usually this is the first source of troubles when interfacing with erlang

Last Post!

christhekeele

christhekeele

Yay I’m so glad my shot in the dark worked!

Where Next?

Popular in Questions Top

joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 records...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
aalberti333
As the title describes, I’m trying to run Enum.map() over a list of key/value pairs, where the value is a map. My data looks like this: ...
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36689 110
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
alice
Hey, Just curious what are the main benefits of Elixir compared to Clojure? When is Elixir more useful than Clojure and vice versa? Th...
New
AstonJ
Posting this to see if we can make things easier for people to get into Neovim. If you use Neovim and have a favourite distro please let ...
New