2017-08-22 69 views
0

目前我正在製作一個照片編輯器應用程序。我有活動,您可以添加文字到圖像。我需要用位圖中的文字保存圖像。我已經嘗試保存繪圖緩存,但問題是它以低質量保存圖像。原始圖像4032 * 3024當我保存它使用的圖像尺寸是1517 * 1137.我試圖縮放到原始大小的位圖,但質量太差。現在我試圖在畫布上繪製原始位圖,然後在與View上相同的位置繪製文本。 float x = editText.getLeft() * (scale); float y = editText.getTop() * (scale); canvas.drawText(editText.getText().toString(), x, y, tp); 但由於某些原因文本不在同一個地方。我試着用密度來獲得座標,但它也不起作用。使用textview保存Imageview

<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> 

這裏是Java代碼:

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; } 

回答

0

最後我找到了解決方案。 當我計算屏幕規模

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

我分割整數和接收錯誤的值; 相反,它應該有

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

,然後你可以在畫布上的正確位置繪製。

1

editText.getLeft()editText.getTop()給出的座標相對於他們的父母,而canvas.drawText()需要絕對座標(相對於根)作爲參數。

您應該採用editText的絕對座標(相對於層次結構中的根元素)。要查找絕對視圖座標,可以使用view.getLocationOnScreen()或view.getLocationInWindow()。謝謝。

+0

好的,我試過了。現在X-asis在正確的位置,但Y-asis比它應該高一點?也許我錯過了什麼? – ipauler

+1

您是否嘗試過使用view.getLocationOnScreen()或view.getLocationInWindow()。另外,嘗試在這個線程的其他方法https://stackoverflow.com/questions/17623829/get-position-of-view-with-respect-to-top-most-parent-in-android?rq=1 –

+0

沒有它僅當圖像處於縱向尺寸時,高度大於寬度時,橫向時位於錯誤位置時才起作用。 – ipauler