masynchin

masynchin

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

Showing Posts 1 to 5

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

masynchin

masynchin OP

I replaced font() with:

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

But it doesn’t change error. You say

have you tried using charlists

and I replaced String.graphemes(text) with String.to_charlist(text), now it produces following traceback:

** (EXIT from #PID<0.246.0>) shell process exited with reason: an exception was raised:
    ** (CaseClauseError) no case clause matching: <<255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255
, ...>>
        (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:79: :egd_png.compress_image/4
        (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:73: :egd_png.bitmap2png/4
        (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:62: :egd_png.binary/3
        (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd.erl:240: :egd.loop/1

Interactive Elixir (1.13.0) - press Ctrl+C to exit (type h() ENTER for help)

16:40:22.380 [error] Process #PID<0.285.0> raised an exception
** (CaseClauseError) no case clause matching: <<255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 25
5, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, ..
.>>
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:79: :egd_png.compress_image/4
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:73: :egd_png.bitmap2png/4
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd_png.erl:62: :egd_png.binary/3
    (egd 0.10.0) c:/expro/image_text/deps/egd/src/egd.erl:240: :egd.loop/1

It looks like previous problem was solved but new one created :slight_smile:

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 OP

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

christhekeele

christhekeele

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

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
ryanwinchester
apply_graft/2 doesn’t rewrite an add_many sub-workflow’s deps on an add step. Grafted jobs cancel with “upstream job was deleted” Version...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews