Как преобразовать const / массив модуля erlang (wxImage) в список в Elixir?
Я пытаюсь манипулировать изображением "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 ответ
Я поиграл с :wxImage
и я нашел пару проблем с вашим кодом:
- Вам нужно позвонить
:wx.new()
чтобы инициализировать WX до любого из:wxImage
функции будут работать. - Аргумент к
getData/1
должен быть дескриптором изображения, а не данными двоичного файла. Из документов:
wxImage ()
Ссылка на объект. Представление является внутренним и может быть изменено без уведомления. Его нельзя использовать для сравнения, хранящегося на диске или распространяемого для использования на других узлах.
И для getData/1
:
getData (This) -> binary ()
Типы
Это = 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
функции, которые вам нужны.