如何将 erlang 模块 (wxImage) const/array 转换为 Elixir 中的列表?
How to convert erlang module (wxImage) const/array to a list in Elixir?
我正在尝试使用 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
我试了一下 :wxImage
,发现你的代码有几个问题:
- 您需要先调用
:wx.new()
来初始化 wx,然后 :wxImage
函数才能正常工作。
getData/1
的参数应该是图像句柄,而不是二进制文件数据。来自 docs:
wxImage()
An object reference, The representation is internal and can be changed without notice. It can't be used for comparsion stored on disc or distributed for use on other nodes.
对于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
functions。
我正在尝试使用 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
我试了一下 :wxImage
,发现你的代码有几个问题:
- 您需要先调用
:wx.new()
来初始化 wx,然后:wxImage
函数才能正常工作。 getData/1
的参数应该是图像句柄,而不是二进制文件数据。来自 docs:
wxImage()
An object reference, The representation is internal and can be changed without notice. It can't be used for comparsion stored on disc or distributed for use on other nodes.
对于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
functions。