2017-03-01 3 views
0

Verglichen mit der Bitmap von res/drawable bekommen, ist die Qualität der gleichen Bitmap von intent ist viel niedriger.Android - Bitmap Auflösung Verlust

Da das aktuelle Projekt wirklich um die Bildqualität besorgt ist, möchte ich die ursprünglichen Bitmaps (ohne Komprimierung oder Auflösungsverlust) vom Telefonspeicher erhalten.

Also, wie kann ich die hochwertige Bitmap von intent bekommen?

I intent verwenden, um eine Bitmap aus dem externen Speicher auf diese Weise zu bekommen,

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    Button galleryBtn = new Button(getActivity()); 
    galleryBtn.setText("Import Photo..."); 
    galleryBtn.setOnClickListener(v -> { 
     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_GET_CONTENT); 
     intent.setType("image/*"); 
     this.startActivityForResult(intent, 0); 
    }); 

    //... some more code here 
} 

//... some more code here 

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == 0) 
     try { 
      if (data != null) { 
       InputStream stream = getActivity().getContentResolver().openInputStream(
        data.getData()); 
       imageBitmap = BitmapFactory.decodeStream(stream); 
       stream.close(); 

       imageView.setImageBitmap(imageBitmap); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
} 

Und ich bekomme die Bitmap aus res auf diese Weise

imageBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
+0

getData ein Miniaturbild zurückgibt, müssen Sie den Uri von der Absicht bekommen mit 'getDataString()' dann die imave über den – tyczj

+0

@tyczj Uri erhalten: Nicht wahr? 'data.getData()' gibt das 'Uri' an den Inhalt zurück, der über' ACTION_GET_CONTENT' ausgewählt wurde. – CommonsWare

+0

"die Qualität der gleichen Bitmap, die von der Absicht kommt, ist viel niedriger" - AFAIK, beide Codewege durchlaufen die gleiche Bilddecodierungslogik. Bitte bearbeiten Sie Ihre Frage und verlinken Sie zu einem Bitmap, das Ihnen diesen Effekt gibt, zusammen mit Links zu Screenshots, die die Ergebnisse der Verwendung der Ressource zeigen und den 'ACTION_GET_CONTENT' -gelieferten' Uri' verwenden. – CommonsWare

Antwort

-1

Intent hat Größenbeschränkung passieren Absicht, also können Sie öffentliche statische Objekte verwenden, um Bitmaps von Service zu Broadcast zu übertragen

public class ImageBox { 
    public static Queue<Bitmap> mQ = new LinkedBlockingQueue<Bitmap>(); 
} 

Pass in Service,

private void downloadFile(final String url){ 
     mExecutorService.submit(new Runnable() { 
      @Override 
      public void run() { 
       Bitmap b = BitmapFromURL.getBitmapFromURL(url); 
       synchronized (this){ 
        TaskCount--; 
       } 
       Intent i = new Intent(ACTION_ON_GET_IMAGE); 
       ImageBox.mQ.offer(b); 
       sendBroadcast(i); 
       if(TaskCount<=0)stopSelf(); 
      } 
     }); 
} 

BroadcastReceiver,

private final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      LOG.d(TAG, "BroadcastReceiver get broadcast"); 

      String action = intent.getAction(); 
      if (DownLoadImageService.ACTION_ON_GET_IMAGE.equals(action)) { 
       Bitmap b = ImageBox.mQ.poll(); 
       if(b==null)return; 
       if(mListener!=null)mListener.OnGetImage(b); 
      } 
     } 
}; 

Es sollte für Sie arbeiten. Lassen Sie mich wissen, ob weitere Hilfe erforderlich ist.

-1

versuchen, dies in Ihnen onActivityResult,

   Uri uri = data.getData(); 
       String[] filePathColumn = {MediaStore.Images.Media.DATA}; 
       Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null); 
       cursor.moveToFirst(); 
       int columnIndex = cursor.getColumnIndex(filePathColumn[0]); 
       String imagePath = cursor.getString(columnIndex); 
       Bitmap imageBitmap = BitmapFactory.decodeFile(imagePath); 
       cursor.close(); 
+0

Dies funktioniert nur, wenn der 'Uri' aus dem' MediaStore' kommt und dann nur wenn der 'MediaStore' einen Pfad hat, und * dann * nur, wenn der Pfad ein Ort ist, an dem die App Lesezugriff hat (zB nicht entfernbarer Speicher). – CommonsWare

+0

Korrigieren Sie mich, wenn ich falsch liege, aber um Bilder aus der Galerie zu erhalten, muss die App Lesezugriff auf den Speicher haben, richtig? –

+0

Die App benötigt 'READ_EXTERNAL_STORAGE'. Dies gilt nicht für Wechselspeicher. Ein 'Uri', der aus dem' MediaStore' stammt und verwendet wird, verlässt sich auf den '' MediaStore' *, der Zugriff auf den Wechselspeicher hat, was ihm vom Gerätehersteller ermöglicht wird. In Ihrem Fall umgehen Sie das und die App hat keinen Zugriff auf den Wechselspeicher (auf Android 4.4 und höher). – CommonsWare