Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 通过套接字发送位图_Android_Sockets_Bitmap - Fatal编程技术网

Android 通过套接字发送位图

Android 通过套接字发送位图,android,sockets,bitmap,Android,Sockets,Bitmap,我正在通过Socket发送Bitmap(从文件解码),我担心一次调用就无法write()所有字节[] Bitmap bitmap = BitmapFactory.decodeFile(path); int cBytes = bitmap.getByteCount(); ByteBuffer cBuffer = ByteBuffer.allocate(cBytes); bitmap.copyPixelsToBuffer(cBuffer); bitmap.recycle(); byte[] bitm

我正在通过
Socket
发送
Bitmap
(从文件解码),我担心一次调用就无法
write()
所有
字节[]

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

这就是我获取字节[]的方式。那么通过
Socket
发送这个数组的方法是什么,我应该把它分成块吗?比如实现一个队列之类的;或者有没有什么课程可以帮我完成这个任务

我使用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:(哦,明白了。我当时不知道:你的应用程序要求你使用套接字吗?为什么不直接使用HTTP?我的老板要求,如果它依赖于meI Googled,我会完全使用HTTP,并且发现这听起来像你可以使用OutputStream和InputStream来完成?谢谢,我实际上是在问是否应该将它划分为块并排队,s因为位图可能有1200万字节(我相信是1200万像素的图像),我不认为你可以只
Socket>写(1200万字节数组)
问题不在于
Socket>写(1200万字节数组)
…问题在于:如何在内存中不让
1200万字节数组
崩溃应用程序(甚至在尝试通过TCP发送这些字节之前)如果要发送文件,则不要使用位图和BitmapFactory。也不需要在内存中加载整个文件。只需打开文件的FileInputStream。在socket.getOutputStream上打开OutputStream。然后在其中创建一个循环,读取/写入16385字节的块。这正是我要寻找的答案,介意写一个答案吗请举个例子好吗?