有没有一种方法可以将图像转换为使用ImageJ Jython脚本编码的URL?

时间:2019-07-18 09:07:17

标签: python base64 urlencode imagej

我希望将用户当前打开的图像(在ImageJ,斐济)编码为字符串或直接编码为URL,以便兄弟可以解释该图像

关于将在图像上应用过滤器(消除噪音)的外部训练模型的项目,将其“重新打包”为URL编码(如果需要,通过toString传递),然后将其重新发送给用户(插件斐济会将URL解码为显示新的已处理图像)

我尝试使用imageplus格式,我可以将图像的字节数组与BufferedImage一起使用,但似乎无法进一步使其成为URL编码

我正在努力寻找一种方法(在imageJ上工作)以直接在URL中甚至通过base64传递它,因为它在imageJ上不工作,这正常吗?

from ij import IJ
from java.awt.image import BufferedImage
from java.io import ByteArrayOutputStream
from java.io import File 
from javax.imageio import ImageIO
from java.util import Base64 
from java.lang import StringBuffer
import base64
import json


#imagePlus will get the currently opened image
imp = IJ.getImage()

#buffered image
buffered = imp.getBufferedImage()
print(imp.getCurrentSlice())

#Byte Array conversion
baos = ByteArrayOutputStream()
ImageIO.write( buffered, "PNG", baos )
print(baos.size())
baos.flush()
imageInByte = baos.toByteArray()
baos.close()

print(len(imageInByte))

#ImageJ doesn't like this at all

#dataStr = json.dumps(imageInByte)
#base64EncodedStr = base64.b64encode(dataStr)
#print(base64EncodedStr)

print(type(imageInByte[0]))

这是我无法再利用的映像的字节数组版本

我敢肯定有一种方法可以用URL编码该图像,但是我尝试过的所有内容(例如“直接到URL”或base64)都无法工作(由imageJ解释)或Something。我也无法将字节数组转换为字符串,因为我需要numpy库来执行此操作,而ImageJ不支持它 而且我无法将此字节格式作为toString的列表。

我会想到这里,因为我从来没有得到过JavaScript的答案,而不得不将其翻译成Python,因为我虽然解决方案会更“知名”

我尝试了第二种方法

import json
import base64
from ij import IJ


imageFile = IJ.getImage()

myStringImage = base64.b64encode(imageFile)
print(myStringImage)
print(type(myStringImage))

我需要做的事情很简单,但这会给我带来类型错误:

TypeError: b2a_base64(): 1st arg can't be coerced to org.python.core.BufferProtocol

如果有一种方法可以解决某些“类型”或“已定义”问题,则无法使用... 我确定您可以使用ImageJ进行的所有操作?我要问的不是没有可能。.不可能

2 个答案:

答案 0 :(得分:0)

好,所以我需要添加它(测试时希望渺茫)

from org.apache.commons.codec.binary import Base64;

然后我添加以这种方式进行简单编码:

stringImage = Base64.encodeBase64String(baos.toByteArray())

这是浏览器可读的

现在我必须想象一个URL图像(通过URL发送的将来需要过滤的图像,它将在深度学习模型中传递)

如何以相反的方式执行此操作?将base64图像解码为ImageJ上的.PNG,然后显示它?

答案 1 :(得分:0)

更新!这是我找到的解决方案

# writing the base64 into a textfile
new_file = open('imageCode.txt', 'w')
new_file.write(s)
new_file.close()

# decode base64 and create image (in the future, the filtered one, here the same) in .png
new_file_decode = open('imageDecode.png', 'wb')
new_file_decode.write(base64.b64decode(s))
new_file_decode.close()

# display image
IJ.open('imageDecode.png')

我这里的新问题是删除应该是“临时”的文件 每次有人会使用它。

当我想删除解码图​​像和imageCode.txt时,控制台说“发生未知错误” 说它“被另一件事使用”,但是正如您在代码中看到的那样,我“关闭”了它们…… 我不希望用户文件夹中有很多图像,所以我想删除它们,但是我无法继续