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
        }

}

これは、Android2.2.2を実行しているLGOptimusVとAndroid2.3.4を実行しているDroidXで機能します。

ただし、2.3.4(私のDroid Xと同じ)を実行しているHTC Evoを使用しているユーザーは、アップロードされたすべての写真が携帯電話に保存されたとき(およびサーバーに到達したとき)にスクランブルされることを経験しています。画像はギザギザの色の線の配列のように見えます。

ここで何が起こっているのか、問題を解決するために何ができるのかについてのアイデアはありますか?

アップデート:

この電話にアクセスできました。sdcardからjpgファイルを取り出すと、ファイルのサイズは3.5〜4.0 MBと表示されますが、開くことができず、破損している可能性があります...しかし、他のファイルは電話は正常に動作します。

4

3 に答える 3

4

画像サイズに問題があるようです。スクランブルされた画像では、幅と高さが間違っている場合に、配列から画像にデータをデコードします。

サポートされている画面サイズで写真を撮ることができます。

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

それらの1つ、たとえば最大のものを画像サイズとして設定してみてください。

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

JPEG形式のビットマップを出力ストリームに圧縮し ますdataBitmap

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 に答える
0

フル(非圧縮)サイズを実現するには、画像をSDカードにキャッシュする必要があります。手順は簡単です

  1. 画像をキャプチャする
  2. キャプチャした画像をSDカードに保存
  3. 保存した画像をSDカードからロード
  4. それをバイト配列に変換してByteArrayBodyとして追加するか、手順3をスキップして、キャッシュされたファイルを使用してファイル本体を作成します。

注:現在、私は自分のPCから離れています。詳細な投稿がない場合は、詳細な回答を投稿します。幸運を。

于 2012-07-22T18:16:43.383 に答える