5

首先,我使用此代码将照片保存到 Android 的 SD 卡:

PictureCallback jpegCallback = new PictureCallback() {
        public void onPictureTaken(byte[] data, Camera camera) {

    FileOutputStream outStream = null;

    currentFilename = String.format("%d", System.currentTimeMillis());              
    outStream = new FileOutputStream("/sdcard/" + currentFilename + ".jpg");                    
    outStream.write(data);
    outStream.close();

    }
};

然后我使用此代码在 Android 设备上上传照片:

public void uploadPhoto() {

        try {

            // Create HttpPost
            HttpPost post = new HttpPost("http://www.example.com/upload.php");
            HttpClient client = new DefaultHttpClient();
            client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
            MultipartEntity entity = new MultipartEntity( HttpMultipartMode.BROWSER_COMPATIBLE );

            // Add the Picture as "userfile"
            entity.addPart( "userfile", new FileBody( 
                new File( "/sdcard/", currentFilename + ".jpg" ),
                "image/jpeg")
            );


            // Send the data to the server
            post.setEntity( entity );
            client.execute( post );


        } catch (Exception e) {
            // catch
        } finally {
            // finally
        }

}

这适用于我运行 Android 2.2.2 的 LG Optimus V 和运行 Android 2.3.4 的 Droid X

但是 - 一位拥有运行 2.3.4 的 HTC Evo(与我的 Droid X 相同)的用户正在经历她上传的所有照片在保存到她的手机时(以及当它们到达服务器时)都被打乱了。图像看起来像一组锯齿状的彩色线条。

关于这里可能发生的事情以及可以采取哪些措施来解决问题的任何想法?

更新:

我能够访问这部手机,当我从 sdcard 中提取 jpg 文件时,它说文件大小为 3.5 - 4.0 MB,但它们无法打开并且可能已损坏......但另一个文件电话正常工作。

4

3 回答 3

4

看起来图片大小有问题。当宽度和高度是乱码图像的错误结果时,将数据从数组解码到图片。

可能会使用支持的屏幕尺寸拍摄照片:

Parameters params = camera.getParameters();
List<Camera.Size> sizes = params.getSupportedPictureSizes();

尝试将其中一个,例如最大的,设置为图片大小:

List<Size> sizes = params.getSupportedPictureSizes();
Size theBiggest=null;
int maxWidth = 0;
for (Size s : sizes) {
    if (s.width > maxWidth) {
        maxWidth = s.width;
        theBiggest = s;
    }
}

params.setPictureSize(theBiggest.width, theBiggest.height);
camera.setParameters(params);
于 2012-07-26T21:06:07.910 回答
0

图像需要缓存到 sdcard 以实现完整(非压缩)大小。步骤很简单

  1. 捕捉图像
  2. 将捕获的图像保存到 SD 卡
  3. 从 sdcard 加载保存的图像
  4. 将其转换为字节数组并添加为 ByteArrayBody,或者您可以跳过第 3 步并使用缓存文件创建文件正文。

注意:目前我远离我的电脑。如果没有详细的帖子,我会发布详细的答案。祝你好运。

于 2012-07-22T18:16:43.383 回答
0

将JPEG格式的位图压缩到输出流中。假设data是一个Bitmap 类型

currentFilename = String.format("%d", System.currentTimeMillis());              
outStream = new FileOutputStream("/sdcard/" + currentFilename + ".jpg");   
data.compress(Bitmap.CompressFormat.JPEG, 90, outStream );    
outStream.close();

您可以将压缩比参数更改为compressapi.. 例如,传递 80 以获得 80% 的压缩率。

这篇文章可能与您的问题有关。

于 2012-07-22T17:32:16.307 回答