将图像从android应用发送到本地主机

时间:2018-12-04 10:20:02

标签: android python flask

我想使用android应用程序中的按钮将图像发送到本地主机。在本地主机中,该图像传递给使用python开发的模型。

使用图像进行处理后,模型会将输出提供给android应用。取得结果的结果很好。

我想知道如何发送图像?

或建议使用另一种方法进行该过程。

这是模型中的代码,用于获取图像,并将其复制到PC的测试文件夹中。我想开发此图像以从android应用获取图像。

def process_test_data():
testing_data = []
for img in tqdm(os.listdir(TEST_DIR)):
    path = os.path.join(TEST_DIR,img)
    img_num = img.split('.')[0]
    img = cv2.imread(path,cv2.IMREAD_GRAYSCALE)
    img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))
    testing_data.append([np.array(img), img_num])
    print("\n****testing_data********",testing_data)
shuffle(testing_data)
np.save('test_data.npy', testing_data)
return testing_data

1 个答案:

答案 0 :(得分:0)

这实际上取决于您使用哪个库连接到Internet。但是对于发送图片,我建议先将其转换为Base64文本并发送。 Python一定会知道如何处理它。

    fun bitmapToBase64StringInline(bitmap: Bitmap): String {
        val byteArrayOutputStream = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.JPEG, 90, byteArrayOutputStream)
        val bytes = byteArrayOutputStream.toByteArray()
        return android.util.Base64.encodeToString(bytes, Base64.NO_WRAP)
    }

此外,最好在单独的线程中执行此操作,并在使用大图像时注意OOM异常。 要发送它,请使用一些不错的连接库,例如OkHttp,Volley,Retrofit等。或者,只需实现一个基本的AsyncTask即可,如下所示:

protected void doInBackground(String... params) {  
URL url = new URL(yourTextUrl);


        try {
                    connection = (HttpURLConnection) url.openConnection(); 
                    connection.setDoOutput(true);
                    connection.setConnectTimeout(MyConstants.CONNECTION_TIMEOUT);
                    connection.setReadTimeout(MyConstants.READ_TIMEOUT);
                    connection.setRequestMethod("POST");
                    connection.setUseCaches(false);
                    connection.connect();
                    Writer writer = new OutputStreamWriter(connection.getOutputStream());
                    String out = params[0];
                    Log.d("Uploading this: ", out);
                    writer.write(out);
                    writer.flush();
                    writer.close();

        } catch (IOException e) {
            e.printStackTrace();
            Log.e("ERR", e.getMessage());
            if (null != e.getMessage() && e.getMessage().equals("timeout")) {
                this.cancel(true);
            }
        } finally {
                connection.disconnect(); 
        }
}
  

连接是HttpURLConnection或Http s URLConnection,基于   您的协议。

我希望它足够清楚。