2011-12-07 21 views
9

Przesyłam obraz na serwer i zanim to nastąpi, chciałbym zmienić wymiary obrazu. I uzyskać obraz z URI tak:zmiana rozmiaru obrazu z pliku

Constants.currImageURI = data.getData(); 

Jest to wezwanie, aby przesłać obraz:

String response = uploadUserPhoto(new File(getRealPathFromURI(Constants.currImageURI))); 

    public String uploadUserPhoto(File image) { 

    DefaultHttpClient mHttpClient; 
    HttpParams params = new BasicHttpParams(); 
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); 
    mHttpClient = new DefaultHttpClient(params); 

    try { 
     HttpPost httppost = new HttpPost("http://myurl/mobile/image"); 

     MultipartEntity multipartEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); 
     multipartEntity.addPart("userID", new StringBody(Constants.userID)); 
     multipartEntity.addPart("uniqueMobileID", new StringBody(Constants.uniqueMobileID)); 
     multipartEntity.addPart("userfile", new FileBody(image, "mobileimage.jpg", "image/jpeg", "UTF-8")); 
     httppost.setEntity(multipartEntity); 

     HttpResponse response = mHttpClient.execute(httppost); 
     String responseBody = EntityUtils.toString(response.getEntity()); 

     Log.d(TAG, "response: " + responseBody); 
     return responseBody; 

    } catch (Exception e) { 
     Log.d(TAG, e.getMessage()); 
    } 
    return ""; 
} 

Czy istnieje sposób, aby zmienić rozmiar pliku w oparciu o wymiarach w pikselach?

Dzięki.

Odpowiedz

8

To jest wzięte z ThinkAndroid pod tym adresem: http://thinkandroid.wordpress.com/2009/12/25/resizing-a-bitmap/

Chciałbym spojrzeć na możliwości tworzenia Bitmap lub odkształcalne z zasobów, a jeśli chcesz, aby zmienić jego rozmiar skorzystać z poniższego kodu.

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { 
    int width = bm.getWidth(); 
    int height = bm.getHeight(); 
    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    // Create a matrix for the manipulation 
    Matrix matrix = new Matrix(); 

    // Resize the bit map 
    matrix.postScale(scaleWidth, scaleHeight); 

    // Recreate the new Bitmap 
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); 
    return resizedBitmap; 

} 

EDIT: Jak sugeruje w innym komentarzu Bitmap.createScaledBitmap powinny być wykorzystywane do lepszej jakości podczas zmiany rozmiaru.

21

Zastosowanie Bitmap.createScaledBitmap jak inni sugerowane.

Jednak ta funkcja nie jest zbyt inteligentna. Jeśli skalowanie do mniej niż 50% wielkości, jesteś prawdopodobne, aby uzyskać to:

enter image description here

Zamiast tego:

enter image description here

Czy widzisz złe wygładzanie obrazu z 1 ? createScaledBitmap da ci ten wynik.

Powód jest filtrowanie pikseli, gdzie niektóre piksele są całkowicie pomijane ze źródła, jeśli skalowanie do < 50%.

Aby uzyskać wynik drugiej jakości, należy zmniejszyć rozdzielczość Bitmapy o połowę, jeśli jest ona większa niż dwukrotnie większy niż pożądany wynik, a następnie wywołać funkcję createScaledBitmap.

I jest więcej sposobów na zmniejszenie o połowę (lub ćwierć lub osiem) obrazów. Jeśli masz Bitmapę w pamięci, rekursywnie wywołujesz Bitmap.createScaledBitmap, aby zmniejszyć o połowę obraz.

Po załadowaniu obrazu z pliku JPG implementacja jest jeszcze szybsza: używasz BitmapFactory.decodeFile i poprawnie ustawiasz parametr Opcje, głównie pole inSampleSize, które steruje procesem ładowania załadowanych obrazów, wykorzystując cechy JPEG.

Wiele aplikacji, które udostępniają miniaturki obrazów, używa na ślepo Bitmap.createScaledBitmap, a miniatury są po prostu brzydkie. Bądź inteligentny i używaj odpowiedniego próbkowania obrazu.

3

Zobacz co Google recommends doing (as @Pointer Null advised):

public int calculateInSampleSize(
      BitmapFactory.Options options, int reqWidth, int reqHeight) { 
    // Raw height and width of image 
    final int height = options.outHeight; 
    final int width = options.outWidth; 
    int inSampleSize = 1; 

    if (height > reqHeight || width > reqWidth) { 

     final int halfHeight = height/2; 
     final int halfWidth = width/2; 

     // Calculate the largest inSampleSize value that is a power of 2 and keeps both 
     // height and width larger than the requested height and width. 
     while ((halfHeight/inSampleSize) > reqHeight 
       && (halfWidth/inSampleSize) > reqWidth) { 
      inSampleSize *= 2; 
     } 
    } 

    return inSampleSize; 
} 

nazywam powyżej rozmiaru dużego obrazu:

// Check if source and destination exist 
// Check if we have read/write permissions 

int desired_width = 200; 
int desired_height = 200; 

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inJustDecodeBounds = true; 

BitmapFactory.decodeFile(SOME_PATH_TO_LARGE_IMAGE, options); 

options.inSampleSize = calculateInSampleSize(options, desired_width, desired_height); 
options.inJustDecodeBounds = false; 

Bitmap smaller_bm = BitmapFactory.decodeFile(src_path, options); 

FileOutputStream fOut; 
try { 
    File small_picture = new File(SOME_PATH_STRING); 
    fOut = new FileOutputStream(small_picture); 
    // 0 = small/low quality, 100 = large/high quality 
    smaller_bm.compress(Bitmap.CompressFormat.JPEG, 50, fOut); 
    fOut.flush(); 
    fOut.close(); 
    smaller_bm.recycle(); 
} catch (Exception e) { 
    Log.e(LOG_TAG, "Failed to save/resize image due to: " + e.toString()); 
} 
Powiązane problemy