2017-08-22 5 views
0

Momentan mache ich eine Fotoeditor-App. Ich habe Aktivität, wo Sie dem Bild einen Text hinzufügen können. Ich muss Bild mit Text in Bitmap speichern. Ich habe bereits versucht, Zeichnungscache zu speichern, aber das Problem ist, dass es Bild in schlechter Qualität speichert. Original-Bild 4032 * 3024, wenn ich es speichern verwendet Größe von Imageview, die 1517 * 1137 sind. Ich habe versucht, Bitmap bis zur Originalgröße zu skalieren, aber die Qualität ist zu schlecht. Jetzt versuche ich, Original-Bitmap auf Leinwand zu zeichnen und dann Text an der gleichen Stelle zu zeichnen wie in View. float x = editText.getLeft() * (scale); float y = editText.getTop() * (scale); canvas.drawText(editText.getText().toString(), x, y, tp); Aber aus irgendeinem Grund ist Text nicht an der gleichen Stelle. Ich habe versucht, Dichte zu verwenden, um Koordinaten zu erhalten, aber es funktioniert auch nicht.Bildansicht speichern Mit Textansicht zu Bitmap

<RelativeLayout 

    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_above="@+id/add_text_color_picker_relative_layout" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_alignParentTop="true"> 

    <RelativeLayout 
     android:id="@+id/edit_photo_add_text_layout" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerInParent="true"> 

     <ImageView 
      android:id="@+id/edit_photo_add_text_main_image" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_centerInParent="true" 
      android:adjustViewBounds="true" 
      android:scaleType="fitCenter" /> 

     <EditText 
      android:id="@+id/edit_photo_add_text_text" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/rect_edittext" 
      android:hint="Поле для текста" 
      android:inputType="textNoSuggestions" 
      android:padding="4dp" 
      android:textSize="14dp" /> 
    </RelativeLayout> 

</RelativeLayout> 

Und hier ist Java-Code:

public Bitmap createImage(View view, int imageViewId, int textViewId, Context context){ 
    ImageView imageView = (ImageView) view.findViewById(imageViewId); 

    Bitmap bitmap = ((BitmapDrawable) imageView.getDrawable()).getBitmap(); 

    float bitmapRatio = (bitmap.getWidth())/bitmap.getHeight(); 
    float imageViewRatio = (imageView.getWidth())/imageView.getHeight(); 

    float scaleW = bitmap.getWidth()/imageView.getWidth(); 
    float scaleH = bitmap.getHeight()/imageView.getHeight(); 
    android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); 
    bitmap = bitmap.copy(bitmapConfig, true); 

    EditText editText = (EditText) view.findViewById(textViewId); 

    float density = context.getResources().getDisplayMetrics().density; 
    Canvas canvas = new Canvas(bitmap); 
    canvas.setBitmap(bitmap); 
    TextPaint tp = new TextPaint(TextPaint.ANTI_ALIAS_FLAG); 
    tp.setColor(Color.WHITE); 
    tp.setTextSize(editText.getTextSize()*density); 

    Resources resources = context.getResources(); 
    float scale = resources.getDisplayMetrics().density; 

    int[] xy = {0, 0}; 
    editText.getLocationOnScreen(xy); 
    float x = xy[0] * (scaleW); 
    float y = xy[1] * (scaleH); 

    canvas.drawText(editText.getText().toString(), x, y, tp); 
    canvas.save(); 
    canvas.restore(); 

    return bitmap; } 

Antwort

0

Endlich habe ich die Lösung gefunden. Wenn ich die Berechnung Bildschirm Skala

float scaleW = bitmap.getWidth()/imageView.getWidth();

Ich bin auf ganze Zahlen zu teilen und falschen Wert zu empfangen; Statt sollte es

float scaleW = (float)bitmap.getWidth()/(float)imageView.getWidth();

sein und dann können Sie auf der rechten Position der Leinwand ziehen.

1

editText.getLeft() und editText.getTop() gibt Koordinaten im Verhältnis zu ihren Eltern, während canvas.drawText() absoluten Koordinaten nimmt (in Bezug auf root) als Argument.

Sie sollten absolute Koordinaten von editText nehmen (in Bezug auf das Wurzelelement in Ihrer Hierarchie). Um absolute Ansichtskoordinaten zu ermitteln, können Sie view.getLocationOnScreen() oder view.getLocationInWindow() verwenden. Vielen Dank.

+0

Ok, ich habe es versucht. Jetzt auf der X-asis ist es an der richtigen Stelle, aber Y-asis ein wenig groß höher als es sein sollte? Vielleicht fehlt mir etwas? – ipauler

+1

Haben Sie mit view.getLocationOnScreen() oder view.getLocationInWindow() versucht. Versuchen Sie auch andere Methode in diesem Thread https://stackoverflow.com/questions/17623829/get-position-of-view-with-respect-to-top-most-parent-in-android?rq=1 –

+0

Nein, es funktioniert nur, wenn das Bild im Hochformat ist, wenn die Höhe größer als die Breite ist, in der Landschaft ist es an der falschen Stelle. – ipauler

Verwandte Themen