【问题标题】:Sending Bitmaps over Socket通过 Socket 发送位图
【发布时间】:2014-07-04 00:11:33
【问题描述】:

我正在通过Socket 发送Bitmap(从文件中解码),我担心我无法通过一个电话发送write() 所有byte[]

Bitmap bitmap = BitmapFactory.decodeFile(path);
int cBytes = bitmap.getByteCount();
ByteBuffer cBuffer = ByteBuffer.allocate(cBytes);
bitmap.copyPixelsToBuffer(cBuffer);
bitmap.recycle();
byte[] bitmapArray = cBuffer.array();

这就是我获得byte[] 的方式。那么通过Socket 发送这个数组的方法是什么,我应该把它分成块吗?比如实现一个队列什么的;或者有什么课程可以帮助我进行这个发送吗?

【问题讨论】:

  • 我在 Google 上找到了这个 stackoverflow.com/questions/2878867/… 听起来你可以使用 OutputStream 和 InputStream 来做到这一点?
  • 谢谢,我实际上是在问是否应该将其分成块并排队,因为位图可能有 1200 万字节(我相信即 12 兆像素的图像),我不认为你可以Socket#write(my12MillionBytesArray)
  • 问题不是Socket#write(my12MillionBytesArray) ...问题是:如何不使应用程序在内存中使用my12MillionBytesArray 崩溃(甚至在尝试通过TCP 发送这些字节之前)
  • 如果是发送文件则不要使用Bitmap和BitmapFactory。也不需要将整个文件加载到内存中。只需打开文件的 FileInputStream 即可。在 socket.getOutputStream 上打开一个 OutputStream。然后创建一个循环,在其中读取/写入 16385 字节的块。
  • 这正是我正在寻找的答案,介意用一个例子写一个答案吗?

标签: android sockets bitmap


【解决方案1】:

我使用的是 loopj 的异步 http 库,但我是这样做的:

public void add_image_android(final Bitmap image) 
{ 
    final ByteArrayInputStream bs;
    final Bitmap targetBitmap;

    Matrix matrix = new Matrix();
    matrix.postRotate(90);
    targetBitmap = Bitmap.createBitmap(image, 0, 0, 
                                  image.getWidth(), image.getHeight(), 
                                  matrix, true);


    ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
    targetBitmap.compress(CompressFormat.JPEG, 100, bos); 
    byte[] bitmapdata = bos.toByteArray();
    bs = new ByteArrayInputStream(bitmapdata);
    targetBitmap.recycle();

    String url = "http://www.somesite.com/api.php?callback=add_image";

    RequestParams params = new RequestParams();
    params.put("file", bs);
    params.put("is_android","Y");
    client.post(url, params, new JsonHttpResponseHandler() 
    {
        @Override
        public void onSuccess(JSONObject response)
        {
            try 
            {
                bs.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            ((ResponseListener)_mainContext).add_image_android_response(response.toString());
            return; 
        }
        @Override
        public void onFailure(Throwable e) 
        {
            fireToast("api error:"+e);
            Log.d("api error:",e.toString());
        }

    });
}

【讨论】:

  • 感谢您的回复,但我使用的是 Socket 而不是 HTTP :(
  • 哦,明白了。那时我不知道 :D 您的应用程序是否要求您使用套接字?为什么不直接使用 HTTP?
  • 我老板的要求,如果它取决于我,我完全会选择 HTTP
【解决方案2】:

您可以在单个 write() 中编写它。不需要分块。您的问题将是内存,而不是写入。

【讨论】:

    猜你喜欢
    • 2012-08-27
    • 2013-03-23
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 2020-03-15
    • 2012-07-27
    相关资源
    最近更新 更多