2011-05-28 8 views
19

मैं किसी छवि पर टेक्स्ट कैसे लिख सकता हूं और फिर इसे एंड्रॉइड में सहेज सकता हूं?मैं एंड्रॉइड में एक तस्वीर पर टेक्स्ट कैसे लिखूं और इसे सेव करूं?

मूल रूप से मैं उन छवियों पर कुछ लिखना चाहता हूं जो मेरा कैमरा ऐप उनके लिए क्लिक करेगा। मैं कैमरे के पूर्वावलोकन पर ऑनड्रा विधि का उपयोग करके उन्हें लिख और दिखा सकता हूं। लेकिन उपयोगकर्ता ने तस्वीर पर क्लिक करने के बाद मैं तस्वीर पर टेक्स्ट लिखना चाहता हूं और फिर इसे सहेजना चाहता हूं।

उत्तर

5

आपको एक कैनवास लागू करना है जो उपयोगकर्ता को उस पर आकर्षित करने की अनुमति देता है और फिर उस कैनवास की पृष्ठभूमि को उस विशेष छवि पर सेट करता है। यह सिर्फ एक अनुमान है लेकिन कहीं और वहां है।

+0

आह जो आसान था ... धन्यवाद :-) – nasaa

45

आप एक EditText डाल सकते हैं और इसे में लिखते हैं, और लेखन के बाद, आपको पहले की तरह बिटमैप करने के लिए परिवर्तित:

:

Bitmap bmp = Bitmap.createBitmap(mEditText.getDrawingCache()); 

अब आपके द्वारा बनाए गए छवि जोड़ सकते हैं इस तरह अपनी मूल छवि को bmp

कॉल: Bitmap combined = combineImages(bgBitmap,bmp);

public Bitmap combineImages(Bitmap background, Bitmap foreground) { 

     int width = 0, height = 0; 
     Bitmap cs; 

     width = getWindowManager().getDefaultDisplay().getWidth(); 
     height = getWindowManager().getDefaultDisplay().getHeight(); 

     cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 
     Canvas comboImage = new Canvas(cs); 
     background = Bitmap.createScaledBitmap(background, width, height, true); 
     comboImage.drawBitmap(background, 0, 0, null); 
     comboImage.drawBitmap(foreground, matrix, null); 

     return cs; 
    } 
+0

प्रतिभा, मैं उसमें कभी नहीं होगा। जाने के लिए रास्ता! – JoxTraex

+0

यदि हम दृश्यमान (अग्रभूमि) गतिशील रूप से दृश्य पर रखते हैं (चौड़ाई और ऊंचाई एसडी में मूल छवि से छोटी होती है), फिर मूल छवि 'पृष्ठभूमि' (पृष्ठभूमि = बिटमैप ....) का उपयोग करके, टेक्स्ट स्थिति बदल दी गई। स्थिति कैसे रखें ?! –

+0

कृपया मेरा प्रश्न देखें: http://stackoverflow.com/questions/29960021/keep-added-textview-position-over-imageview-when-saved –

2

तुम्हारी मदद की सुविधा देता है .. आप सभी की बैठक के लिए कैनवास का उपयोग करने के लिए आवश्यक की पहले। एक कस्टम दृश्य बनाएं जो ImageView को बढ़ाता है। यहाँ OnDraw समारोह के लिए कोड की मदद है ..:

@Override 
    public void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     mIcon.setBounds(0, 0, mIcon.getMinimumWidth(), 
       mIcon.getMinimumHeight()); 

     canvas.translate(mPosX, mPosY); 
     canvas.scale(mScaleFactor, mScaleFactor, canvas.getWidth() * 0.5f, 
       canvas.getWidth() * 0.5f); 
     mIcon.draw(canvas); 

     rect = canvas.getClipBounds(); 

     for (Path path : listPath) { 
      canvas.drawPath(path, paint); 

     } 

    } 
अब

onTouch के लिए: अगर आप इस तरह की कार्यक्षमता जूमिंग लागू करना चाहते हैं

@Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     // Let the ScaleGestureDetector inspect all events. 
     mScaleDetector.onTouchEvent(ev); 

     final int action = ev.getAction(); 
     switch (action & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: { 

      if (drawing) { 

       startPoint = new Point((int) ev.getX(), (int) ev.getY()); 
       path = new Path(); 
       float x = ev.getX()/mScaleFactor + rect.left; 
       float y = ev.getY()/mScaleFactor + rect.top; 
       path.moveTo(x, y); 
       path.lineTo(x, y); 

       mLastTouchX_1 = x; 
       mLastTouchY_1 = y; 
      } 

      else { 
       final float x = ev.getX(); 
       final float y = ev.getY(); 

       mLastTouchX = x; 
       mLastTouchY = y; 
       mActivePointerId = ev.getPointerId(0); 
      } 
      break; 
     } 

     case MotionEvent.ACTION_MOVE: { 

      if (drawing) { 

       float x = ev.getX()/mScaleFactor + rect.left; 
       float y = ev.getY()/mScaleFactor + rect.top; 

       path.moveTo(mLastTouchX_1, mLastTouchY_1); 
       path.lineTo(x, y); 

       mLastTouchX_1 = x; 
       mLastTouchY_1 = y; 
      } 

      else { 
       final int pointerIndex = ev 
         .findPointerIndex(mActivePointerId); 
       final float x = ev.getX(pointerIndex); 
       final float y = ev.getY(pointerIndex); 

       // Only move if the ScaleGestureDetector isn't processing a 
       // gesture. 
       if (!mScaleDetector.isInProgress()) { 
        final float dx = x - mLastTouchX; 
        final float dy = y - mLastTouchY; 

        mPosX += dx; 
        mPosY += dy; 

        invalidate(); 
       } 

       mLastTouchX = x; 
       mLastTouchY = y; 
      } 
      break; 
     } 

     case MotionEvent.ACTION_UP: { 
      path_helper_1 = new Path(); 
      path_helper_2 = new Path(); 

      endPoint = new Point((int) ev.getX(), (int) ev.getY()); 

      int left, top, right, bottom; 



      left = endPoint.x - 10; 
      top = endPoint.y - 10; 

      right = endPoint.x + ((endPoint.y/2)); 
      bottom = endPoint.x + ((endPoint.y/2)); 



      float dx, dy; 
      dx = endPoint.x - startPoint.x; 
      dy = endPoint.y - startPoint.y; 

      dx = dx * -1; 
      dy = dy * -1; 

      // dx = dy = 100; 

      double cos = 0.866 * .1; 
      double sin = 0.500 * .1; 

      PointF end1 = new PointF((float) (endPoint.x + (dx * cos + dy 
        * -sin)), (float) (endPoint.y + (dx * sin + dy * cos))); 
      PointF end2 = new PointF((float) (endPoint.x + (dx * cos + dy 
        * sin)), (float) (endPoint.y + (dx * -sin + dy * cos))); 

      // path.moveTo(endPoint.x, endPoint.y); 
      // 
      // path.lineTo(endPoint.x, endPoint.y); 
      // 
      // path.lineTo(end1.x, end1.y); 
      // 
      // path.moveTo(endPoint.x, endPoint.y); 
      // 
      // path.lineTo(end2.x, end2.y); 
      // 
      // 
      // listPath.add(path); 

      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_CANCEL: { 
      mActivePointerId = INVALID_POINTER_ID; 
      break; 
     } 

     case MotionEvent.ACTION_POINTER_UP: { 
      final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
      final int pointerId = ev.getPointerId(pointerIndex); 
      if (pointerId == mActivePointerId) { 
       // This was our active pointer going up. Choose a new 
       // active pointer and adjust accordingly. 
       final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
       mLastTouchX = ev.getX(newPointerIndex); 
       mLastTouchY = ev.getY(newPointerIndex); 
       mActivePointerId = ev.getPointerId(newPointerIndex); 
      } 
      break; 
     } 
     } 
     invalidate(); 

     return true; 
    } 

इसके अलावा एक निजी वर्ग बनाने:

private class ScaleListener extends 
      ScaleGestureDetector.SimpleOnScaleGestureListener { 
     @Override 
     public boolean onScale(ScaleGestureDetector detector) { 

      if (zoom) { 
       mScaleFactor *= detector.getScaleFactor(); 

       // Don't let the object get too small or too large. 
       mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f)); 
      } 
      invalidate(); 
      return true; 
     } 
    } 
} 

उपरोक्त कोड से विचार लें और अपनी आवश्यकताओं के अनुसार परिवर्तन करें। नोट ऊपर कोड ड्रॉइंग और ज़ूमिंग कार्यक्षमता लागू करता है। यदि आप छवियों पर टेक्स्ट जोड़ना चाहते हैं तो पथ ड्राइंग की तरह आप canvas.drawText का उपयोग कर कैनवास पर टेक्स्ट भी खींच सकते हैं। यदि आप एकाधिक टेक्स्ट ओवर छवि चाहते हैं तो एक सरणीसूची बनाएं। बिटमैप पर

0

पाठ जोड़ें:

public Bitmap drawTextToBitmap(Context gContext, 
    int gResId, 
    String gText) { 
    Resources resources = gContext.getResources(); 
    float scale = resources.getDisplayMetrics().density; 
    Bitmap bitmap = 
     BitmapFactory.decodeResource(resources, gResId); 

    android.graphics.Bitmap.Config bitmapConfig = 
     bitmap.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
    bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 

    Canvas canvas = new Canvas(bitmap); 
    // new antialised Paint 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    // text color - #3D3D3D 
    paint.setColor(Color.rgb(61, 61, 61)); 
    // text size in pixels 
    paint.setTextSize((int) (14 * scale)); 
    // text shadow 
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE); 

    // draw text to the Canvas center 
    Rect bounds = new Rect(); 
    paint.getTextBounds(gText, 0, gText.length(), bounds); 
    int x = (bitmap.getWidth() - bounds.width())/2; 
    int y = (bitmap.getHeight() + bounds.height())/2; 

    canvas.drawText(gText, x, y, paint); 

    return bitmap; 
} 

स्रोत: http://www.skoumal.net/en/android-how-draw-text-bitmap/

बिटमैप पर बहु ​​लाइन पाठ जोड़ें:

public Bitmap drawMultilineTextToBitmap(Context gContext, 
            int gResId, 
            String gText) { 

    // prepare canvas 
    Resources resources = gContext.getResources(); 
    float scale = resources.getDisplayMetrics().density; 
    Bitmap bitmap = BitmapFactory.decodeResource(resources, gResId); 

    android.graphics.Bitmap.Config bitmapConfig = bitmap.getConfig(); 
    // set default bitmap config if none 
    if(bitmapConfig == null) { 
    bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888; 
    } 
    // resource bitmaps are imutable, 
    // so we need to convert it to mutable one 
    bitmap = bitmap.copy(bitmapConfig, true); 

    Canvas canvas = new Canvas(bitmap); 

    // new antialiased Paint 
    TextPaint paint=new TextPaint(Paint.ANTI_ALIAS_FLAG); 
    // text color - #3D3D3D 
    paint.setColor(Color.rgb(61, 61, 61)); 
    // text size in pixels 
    paint.setTextSize((int) (14 * scale)); 
    // text shadow 
    paint.setShadowLayer(1f, 0f, 1f, Color.WHITE); 

    // set text width to canvas width minus 16dp padding 
    int textWidth = canvas.getWidth() - (int) (16 * scale); 

    // init StaticLayout for text 
    StaticLayout textLayout = new StaticLayout(
    gText, paint, textWidth, Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false); 

    // get height of multiline text 
    int textHeight = textLayout.getHeight(); 

    // get position of text's top left corner 
    float x = (bitmap.getWidth() - textWidth)/2; 
    float y = (bitmap.getHeight() - textHeight)/2; 

    // draw text to the Canvas center 
    canvas.save(); 
    canvas.translate(x, y); 
    textLayout.draw(canvas); 
    canvas.restore(); 

    return bitmap; 
} 

स्रोत: http://www.skoumal.net/en/android-drawing-multiline-text-on-bitmap/

संबंधित मुद्दे

 संबंधित मुद्दे