2014-04-07 5 views
7

जैसे एंड्रॉइड में छवि को स्थानांतरित करें, स्केल करें और क्रॉप करें, मैं अपने आवेदन में एक छवि फसल चाहता हूं। मैंने बहुत कोशिश की लेकिन सफल नहीं हुआ। एंड्रॉइड डेवलपर के लिए इसकी चुनौती। क्या फेसबुक अपलोड प्रोफ़ाइल तस्वीर जैसे एंड्रॉइड में छवियों को स्थानांतरित करने, स्केल करने और छवियों को फसल करने के लिए कोई विचार या संदर्भ है। अब मैं स्थानांतरित करने, स्केल और फसल और छवि को स्थानांतरित करने में सक्षम हूं। लेकिन फेसबुक की तरह लगातार नहीं। मैं अभिविन्यास के आधार पर फ़िक्स छवि स्केल सेट करना चाहता हूं। मैंने स्क्रीन शॉट -3 संलग्न किया है।फेसबुक प्रोफाइल तस्वीर

नीचे के रूप में मेरे कोड: -

crop_image.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <FrameLayout 
     android:id="@+id/flCrop" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" > 

     <ImageView 
      android:id="@+id/img" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:scaleType="matrix" 
      android:src="@drawable/nature" /> 

     <ImageView 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:layout_gravity="center" 
      android:scaleType="fitXY" 
      android:src="@drawable/blur_with_frame" 
      android:visibility="visible" /> 

     <ImageView 
      android:id="@+id/troll_face" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginBottom="5dp" 
      android:layout_marginLeft="10dp" 
      android:layout_gravity="bottom" /> 
    </FrameLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:onClick="btnSelectPic" 
      android:layout_marginRight="10dp" 
      android:text="select Pic" /> 

     <Button 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="10dp" 
      android:onClick="btnCrop" 
      android:text="Crop" /> 
    </LinearLayout> 

</LinearLayout> 

MainActivity.java

package com.hotveryspicy.maskimage; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.FloatMath; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.view.ViewTreeObserver.OnGlobalLayoutListener; 
import android.widget.FrameLayout; 
import android.widget.ImageView; 
import android.widget.ImageView.ScaleType; 

import com.ipaulpro.afilechooser.utils.FileUtils; 

public class MainActivity extends Activity implements OnTouchListener{ 
    ImageView img; 
    FrameLayout flCrop; 

    int framWidth = 0; 
    int framHeight = 0; 

    int imageHeight ; 
    int imageWidth ; 

    int cropImageWidth = 320; 
    int cropImageHeight = 263; 

    public static int SELECT_PHOTO =0; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.crop_image); 
     img = (ImageView) findViewById(R.id.img); 
     flCrop = (FrameLayout) findViewById(R.id.flCrop); 
     img.setOnTouchListener(this); 


    } 

    public void btnCrop(View v) { 
     ImageView troll_face = (ImageView) findViewById(R.id.troll_face); 
     makeMaskImage(troll_face, R.drawable.nature); 
    } 

    public void btnSelectPic(View v){ 
     Intent intent = new Intent(Intent.ACTION_PICK, 
       android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
     startActivityForResult(intent, 0); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 

     switch (resultCode) { 
     case RESULT_OK: 
      Uri targetUri = data.getData(); 

      final String path = FileUtils.getPath(this, targetUri); 

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

      Bitmap bitmap = null; 
      try { 

       bitmap = BitmapFactory 
         .decodeFile(path); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      imageHeight = options.outHeight; 
      imageWidth = options.outWidth; 

      img.setOnTouchListener(MainActivity.this); 

      img.setImageBitmap(bitmap); 

      break; 
     } 
    } 

    // Method of creating mask runtime 
    public void makeMaskImage(ImageView mImageView, int mContent) { 

     flCrop.setDrawingCacheEnabled(true); 
     Bitmap bitmap = Bitmap.createBitmap(flCrop.getDrawingCache()); 
     flCrop.setDrawingCacheEnabled(false); 

     Log.e("TEST", "Frame W : " + framWidth + " H : " + framHeight); 
     Log.e("TEST", 
       "Bitmap W : " + bitmap.getWidth() + " H : " 
         + bitmap.getHeight()); 

     Bitmap result = Bitmap.createBitmap(bitmap, (framWidth/2) 
       - (cropImageWidth/2) +1, (framHeight/2) 
       - (cropImageHeight/2), cropImageWidth -2, cropImageHeight); 
     mImageView.setImageBitmap(result); 
     mImageView.setScaleType(ScaleType.CENTER); 
     // mImageView.setBackgroundResource(R.drawable.frame); 
    } 





    @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // handle touch events here 
      ImageView view = (ImageView) v; 
      switch (event.getAction() & MotionEvent.ACTION_MASK) { 
       case MotionEvent.ACTION_DOWN: 
        savedMatrix.set(matrix); 
        start.set(event.getX(), event.getY()); 
        mode = DRAG; 
        lastEvent = null; 
        break; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        oldDist = spacing(event); 
        if (oldDist > 10f) { 
         savedMatrix.set(matrix); 
         midPoint(mid, event); 
         mode = ZOOM; 
        } 
        lastEvent = new float[4]; 
        lastEvent[0] = event.getX(0); 
        lastEvent[1] = event.getX(1); 
        lastEvent[2] = event.getY(0); 
        lastEvent[3] = event.getY(1); 
        d = rotation(event); 
        Log.e("MainActivity","MainActivity down d = "+d); 
        break; 
       case MotionEvent.ACTION_UP: 
       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        lastEvent = null; 
        break; 
       case MotionEvent.ACTION_MOVE: 
        if (mode == DRAG) { 
         matrix.set(savedMatrix); 
         float dx = event.getX() - start.x; 
         float dy = event.getY() - start.y; 
         Log.e("TEST","Dx : "+ dx+" Dy : "+ dy); 
         matrix.postTranslate(dx, dy); 
        } else if (mode == ZOOM) { 
         float newDist = spacing(event); 
         if (newDist > 10f) { 
          matrix.set(savedMatrix); 
          float scale = (newDist/oldDist); 
          matrix.postScale(scale, scale, mid.x, mid.y); 
         } 
         if (lastEvent != null && event.getPointerCount() == 3) { 
          newRot = rotation(event); 
          Log.e("MainActivity","MainActivity move d= "+d); 
          float r = newRot - d; 
          float[] values = new float[9]; 
          matrix.getValues(values); 
          float tx = values[2]; 
          float ty = values[5]; 
          float sx = values[0]; 
          float xc = (view.getWidth()/2) * sx; 
          float yc = (view.getHeight()/2) * sx; 
          matrix.postRotate(r, tx + xc, ty + yc); 
         } 
        } 
        break; 
       default: 
        view.setImageMatrix(matrix); 
        return true; 
      } 
      view.setImageMatrix(matrix); 
      return true; 
     } 

     /** 
     * Determine the space between the first two fingers 
     */ 
     private float spacing(MotionEvent event) { 
      float x = event.getX(0) - event.getX(1); 
      float y = event.getY(0) - event.getY(1); 
      return FloatMath.sqrt(x * x + y * y); 
     } 

     /** 
     * Calculate the mid point of the first two fingers 
     */ 
     private void midPoint(PointF point, MotionEvent event) { 
      float x = event.getX(0) + event.getX(1); 
      float y = event.getY(0) + event.getY(1); 
      point.set(x/2, y/2); 
     } 

     /** 
     * Calculate the degree to be rotated by. 
     * 
     * @param event 
     * @return Degrees 
     */ 
     private float rotation(MotionEvent event) { 
      double delta_x = (event.getX(0) - event.getX(1)); 
      double delta_y = (event.getY(0) - event.getY(1)); 
      double radians = Math.atan2(delta_y, delta_x); 
      return (float) Math.toDegrees(radians); 
     } 
     // these matrices will be used to move and zoom image 
     private static Matrix matrix = new Matrix(); 
     private static Matrix savedMatrix = new Matrix(); 
     // we can be in one of these 3 states 
     private static final int NONE = 0; 
     private static final int DRAG = 1; 
     private static final int ZOOM = 2; 
     private int mode = NONE; 
     // remember some things for zooming 
     private PointF start = new PointF(); 
     private PointF mid = new PointF(); 
     private float oldDist = 1f; 
     private float d = 0f; 
     private float newRot = 0f; 
     private float[] lastEvent = null; 

     boolean flag ; 
} 

की तरह मेरे डेमो देख रहे हैं: -

स्क्रीनशॉट -1 Screenshot-1

जब जूम आउट किया गया चित्र नीचे के रूप में अपनी देख: - स्क्रीनशॉट-2 Screenshot-2

वास्तव में मैं क्या समाधान देख रहा हूँ: - स्क्रीनशॉट-3

Screenshot-3

अगर कोई अंदाज़ा नहीं है कृपया मेरी मदद करो। अग्रिम धन्यवाद ...

+0

इम यकीन नहीं वास्तव में क्या आपकी समस्या है, लेकिन शायद यह आपकी मदद कर सकते हैं:

यहाँ GitHub परियोजना की जांच करें। मैं कुछ समान और struggeling करने की कोशिश कर रहा हूँ! http://blog.gunawan.me/2012/03/create-semi-transparent-rounded-border.html – Chris

+0

@ क्रिस, उत्तर के लिए धन्यवाद। महान ट्यूटोरियल। इसे जांचें। :) – jagdish

+0

@jagdish हे, क्या आपने अपनी समस्या हल की है? मैं भी वही कार्यक्षमता चाहता हूं। – Riser

उत्तर

0

मैं पूरी तरह से समझ नहीं पा रहा हूं कि आप क्या करने की कोशिश कर रहे हैं। मैं कुछ इसी तरह काम कर रहा हूं, मैं सोचता हूं।


https://github.com/crystalpal/cropper


क्या इस करता है: भंडारण से एक छवि पढ़ता है, एक फसल आयत के साथ-साथ यह प्रदर्शित करता है, आप चयनित क्षेत्र में कांट-छांट के हैं, और फसली छवि बचाता है। आप फसल के आकार और सहेजी गई छवि के आकार को समायोजित कर सकते हैं।

किसी इरादे का उपयोग करके, छवि की फ़ाइल को नई गतिविधि में पास करें। वहां से, सब कुछ स्वचालित होना चाहिए।

नोट: यह प्रोजेक्ट एंड्रॉइड 4.2 में लिखा गया था, कोड दस्तावेज है, लेकिन एंड्रॉइड का एक सभ्य ज्ञान अनुशंसित है। परियोजना qoppa पीडीएफ पुस्तकालय का उपयोग करता है।

0

मैंने छवि कैप्चर और फसल कार्यक्षमता लागू करते समय नीचे दिए गए ट्यूटोरियल से संदर्भ लिया है। यह आपके लिए सहायक होगा, मुझे यकीन है। यदि कोई issues.I आगे ​​मदद करने की कोशिश करेंगे मुझे जानते हैं, :)

http://code.tutsplus.com/tutorials/capture-and-crop-an-image-with-the-device-camera--mobile-11458

2

मैं एक ऐसी ही आवश्यकता थी। संशोधित फोटोव्यू और क्रॉपर लाइब्रेरी का उपयोग करके एक फसल घटक बनाया गया। उपयोगकर्ता गैलरी से छवि का चयन कर सकते हैं या कैमरे से एक तस्वीर ले सकते हैं और फिर फेसबुक प्रोफ़ाइल तस्वीर फसल के समान छवि को स्थानांतरित और स्केल के साथ फसल कर सकते हैं। जिथूब पर परियोजना साझा करना। https://github.com/ozeetee/AndroidImageZoomCrop

+0

लाइब्रेरी के लिए धन्यवाद, यह स्क्वायर छवि क्रॉपिंग में आकर्षण की तरह काम करता है, हालांकि मैंने आयताकार फसल करने की कोशिश की लेकिन फोटोव्यू छवि सीमाओं को अनदेखा कर रहा है –

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

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