2016-07-08 17 views
1

Ich ziehe Bilder von einem cms und sie sind Banner-Stil (Breite = 900, Höhe = 250). Ich muss sie in einem Vollbild-Porträt-Modus verwenden, also sind sie natürlich stark verzerrt. Ich habe viele verschiedene Dinge mit XML versucht, Größe von Bitmaps, Picasso-Transformationen usw. geändert. Aber ich bin mir nicht sicher, was ich sonst noch versuchen sollte. Die einzige Zeit, in der ich in der Lage war, die Qualität zu erhalten, ist das Centercroping, aber das ist keine Option. Ich brauche das Bild, um sein Seitenverhältnis beizubehalten. Ist das überhaupt möglich, ohne das Seitenverhältnis zu opfern? Das Bildseitenverhältnis 1,7, während das gewünschte ist 0,5625 auf meiner Galaxie s5.Android Bitmap skalieren Banner Bild auf Porträt

bearbeiten, um weitere Informationen:

Dies ist ein proprietäres Projekt, so kann ich die Bilder nicht enthalten Ich verwende aber sie sind Banner-Stil. Sie werden in einer Bildansicht verwendet, die screenSizeHeight - toolbarHeight und screensizewidth/1.2 ist.

so versuche ich die Größe der Bitmap zu ändern. Es ist nur Centercropping und ist viel zu groß.

public static final Bitmap scaleAndCropBitmapByPixelDimensions(final Context context, final Bitmap sourceBitmap, final int targetWidth, final int targetHeight) 
{ 
    try 
    { 
     if (context != null && sourceBitmap != null) 
     { 
      int srcWidth = sourceBitmap.getWidth(); 
      int srcHeight = sourceBitmap.getHeight(); 

      float targetAspectRatio = (float)targetWidth/(float)targetHeight; 
      float srcAspectRatio = (float)srcWidth/(float)srcHeight; 

      int scaleWidth = targetWidth; 
      int scaleHeight = targetHeight; 
      int x = 0; 
      int y = 0; 


      if (srcAspectRatio < targetAspectRatio) 
      { 
       scaleWidth = targetWidth; 
       scaleHeight = (int)((float)(1/srcAspectRatio) * (float)scaleWidth); 
       x = 0; 
       y = (scaleHeight - targetHeight)/2; 
      } 
      else 
      { 
       scaleHeight = targetHeight; 
       scaleWidth = (int)((float)srcAspectRatio * (float)scaleHeight); 
       x = (scaleWidth - targetWidth)/2; 
       y = 0; 
      } 


      Bitmap scaledBitmap = Bitmap.createScaledBitmap(sourceBitmap, scaleWidth, scaleHeight, true); 
      Bitmap croppedBitmap = Bitmap.createBitmap(scaledBitmap, x, y, targetWidth, targetHeight); 
      return croppedBitmap; 
     } 
    } 
    catch (Exception ex) 
    { 
     //Log.e(LOG_TAG, "Error scaling and cropping bitmap", ex); 
     ex.printStackTrace(); 
    } 

    return null; 
} 

Einrichten des Bitmap umwandeln

@Override 
      public Bitmap transform(Bitmap sourceBitmap) { 
       i_bitmap = Utils.scaleAndCropBitmapByPixelDimensions(mContext,sourceBitmap,targetWidth,targetHeight); 


       if (sourceBitmap != i_bitmap) { 
        // Same bitmap is returned if sizes are the same 
        sourceBitmap.recycle(); 
       } 

       return i_bitmap; 


      } 

Bildansicht xml

<ImageView 
    android:id="@+id/bg" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_gravity="center" 
    android:scaleType="center"  /> 

und das Bild mit picasso ist Picasso.with(mContext) .load(url) .transform(transformation) .into(getBg());

Antwort

0

Nun, da das gewünschte Seitenverhältnis Laden das Gegenteil des tatsächlichen Verhältnisses, eine Sache yo Sie können die Bannerbilder einfach drehen (-90º oder + 90º).

Natürlich ist das ein sehr naive Vorschlag. Vielleicht können wir Ihnen eine bessere Lösung anbieten, wenn Sie mehr Details zu den anzuzeigenden Inhalten oder anderen Einschränkungen angeben.

+0

eine Bearbeitung mit mehr Informationen gemacht. Würden Sie das Bild nicht rotieren lassen oder missverstehe ich, was Sie vorschlagen? – user3050491