2016-11-10 20 views
1

ギャラリーから画像を選択し、Base64に変換してサーバーに送信します。 JPEG画像の場合、正常に動作します。同じサーバー上のギャラリーからアップロードした画像がサーバーフォルダに表示されます。しかし、モバイルギャラリーからPNG形式の画像をアップロードすると、サーバー上で同じように表示されません。代わりに、その周りに黒いエッジを作成します。私は本当に何がうまくいかないのか分からないのですか?なぜPNG形式の画像の周囲にPNGが黒いエッジを形成するのですか?

また、私の実際のイメージは、与えられたJPEGイメージと同じです。

参考画像:

JPEG:

enter image description here

PNG:

enter image description here

私はPNG形式の画像のために表示されませんBLACK国境を取り除きたいです。以下は

は私のコードスニペットは、あなたがイメージファイルをアップロードしたい

FileInputStream mFileInputStream = null; 
     try { 
      mFileInputStream = new FileInputStream(imagePathFromSDCard); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] b = new byte[1024]; 
      int bytesRead = 0; 
      while ((bytesRead = mFileInputStream.read(b)) != -1) { 
       bos.write(b, 0, bytesRead); 
      } 

      Bitmap bitmap = safeImageProcessing.decodeFile(uri); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos); 


      byte[] ba = bos.toByteArray(); 
      String encodedImage = Base64.encodeToString(ba, Base64.NO_WRAP); 


//this line sends image base64 to server & there i decode into original 
      new ImageAsync().sendImageProcess(getActivity(), encodedImage, this); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

答えて

0

です。しかし、BitmapFactoryを使ってBitmapFactoryを最初に作成します。次に、ビットマップをjpgまたはpngバイト配列に圧縮します。その後、バイトを文字列にbase64でエンコードしてアップロードします。

どのようなウエスト。そしてファイルを変更しました。中間のビットマップを削除してください。

代わりに、ファイルを直接バイト配列にロードします。次に、通常通りバイト配列を続行します。

私は基本的には、最初にファイルのバイトを30%で転送する必要があるバイト量を増やすようにエンコードするのは悪い考えだと言いました。

+0

ファイルを直接base64に変換してOutOfMemory例外を取得するとクラッシュすると思います。 – VVB

+0

いいえこれは間違いなくより少ないメモリを使用します。それは、ビットマップが最も多く占めるものです。 – greenapps

+0

しかし、可能な限り少ないメモリを使用したい場合は、base64エンコードを開始しないでください。それで、まずmemornyのバイト配列にファイルをロードする必要はありませんが、ファイルを直接アップロードすることができます。 – greenapps

関連する問題