Как преобразовать const / массив модуля erlang (wxImage) в список в Elixir? - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь манипулировать изображением "test.jpg" в Elixir с помощью библиотеки Erlang wxImage, но получаю ошибку. Я не знаю, как преобразовать вывод массива / константы в список, чтобы я мог использовать его в Elixir.

Также я не знаю, почему возникает ошибка функции предложения, когда синтаксис кажется нормальным?

defmodule Imedit2 do
  def readimg(image) do
    {:ok, _file} = File.open("happy737.txt", [:write])
    IO.puts("hi there")
    _output =
      image
      |> File.read!()
      |> :wxImage.getData()
      |> to_charlist()

    # IO.puts(is_list(output))
    # IO.puts(is_tuple(output))
    # IO.binwrite(file, output)
    # File.close(file)
  end
end
iex(58)> Imedit2.readimg("test.jpg")
hi there
** (FunctionClauseError) no function clause matching in :wxImage.getData/1

The following arguments were given to :wxImage.getData/1:

    # 1
    <<255, 216, 255, 226, 2, 28, 73, 67, 67, 95, 80, 82, 79, 70, 73, 76, 69, 0, 1,
      1, 0, 0, 2, 12, 108, 99, 109, 115, 2, 16, 0, 0, 109, 110, 116, 114, 82, 71,
      66, 32, 88, 89, 90, 32, 7, 220, 0, 1, 0, 25, ...>>

gen/wxImage.erl:405: :wxImage.getData/1
lib/imedit2.ex:5: Imedit2.readimg/1

1 Ответ

1 голос
/ 23 марта 2019

Я поиграл с :wxImage и обнаружил пару проблем с вашим кодом:

  1. Вам нужно позвонить :wx.new(), чтобы инициализировать wx перед любым из :wxImageфункции будут работать.
  2. Аргумент getData/1 должен быть дескриптором изображения, а не данными двоичного файла.Из документов :

wxImage ()

Ссылка на объект. Представление является внутренним и может быть изменено безуведомление.Его нельзя использовать для сравнения, хранящегося на диске или распространяемого для использования на других узлах.

И для getData/1:

getData (This) -> binary ()

Types
This = wxImage ()

Таким образом, вы можете сделать это следующим образом:

def readimg(image) do
  :wx.new()

  data =
    image
    |> String.to_charlist()
    |> :wxImage.new()
    |> :wxImage.getData()
    |> :binary.bin_to_list()

  :wx.destroy()
  data
end

Но учтите, что bin_to_list/1 звонок медленный, и я не думаю, что он вам все равно нужен.Возможно, вы захотите остановиться на :wxImage.new(), оставить дескриптор в переменной и использовать его для вызова любых других :wxImage функций , которые вам нужны.

...