如何将erlang模块(wxImage)const / array转换为Elixir中的列表?

时间:2019-03-23 01:02:47

标签: elixir wxerlang

我正在尝试通过使用Erlang wxImage库在Elixir中操作“ test.jpg”图像,但出现错误。我不知道如何将array / const输出转换为列表,所以我可以在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 个答案:

答案 0 :(得分:1)

我玩过:wxImage,发现您的代码有两个问题:

  1. 您需要调用:wx.new()来初始化wx,然后才能使用任何:wxImage函数。
  2. getData/1的参数应该是图像句柄,而不是二进制文件数据。来自docs
  

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 functions