6

मैं इस सरल ऐप को विकसित करने की कोशिश कर रहा हूं जो चित्र लेता है। सब कुछ ठीक है। मेरे पास पूर्वावलोकन के केंद्र में निश्चित आकार अंडाकार आकार छविदृश्य है। छवि का अनुकूलन ठीक काम कर रहा है लेकिन समस्या है, मैं छवि को कैप्चर करना चाहता हूं और अंडाकार आकार वाले छविदृश्य के अंदर स्वचालित रूप से इसे फसल करना चाहता हूं। मैं नहीं करता पूरी छवि को सहेजना चाहते हैं, मैं सिर्फ छवि के हिस्से को चाहता हूं जो आकार के अंदर स्थित है। अब, मुझे नहीं पता कि कैसे आगे बढ़ना है। समाधान के लिए Google पर घंटों के घंटों के बाद मैंने फैसला किया कि मुझे छोड़ना होगा और यहाँ आना होगा। मुझे यह नहीं मिल रहा है कि मैं छवि के उस हिस्से को कैसे प्राप्त कर सकता हूं जो आकार के अंदर है (वह तय अंडाकार आकार छवि)।ओवरले सीमाओं के अंदर क्या है, इसकी तस्वीर लें

public class MainActivity extends Activity implements SurfaceHolder.Callback { 

    Camera camera; 
    SurfaceView surfaceView; 
    SurfaceHolder surfaceHolder; 
    boolean cameraview = false; 
    LayoutInflater inflater = null; 
    private ImageView ImgContainer; 
    private Button btn; 
    private ImageView mIvCaptureImage; 
    FrameLayout frameLayout; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     getWindow().setFormat(PixelFormat.UNKNOWN); 
     frameLayout = (FrameLayout) findViewById(R.id.view); 
     surfaceView = (SurfaceView) findViewById(R.id.camera_preview); 
     ImgContainer = (ImageView) findViewById(R.id.Img_container); 
     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     // GuideBox box = new GuideBox(MainActivity.this); 
     // llContainer.addView(box, new LayoutParams(LayoutParams.WRAP_CONTENT, 
     // LayoutParams.WRAP_CONTENT)); 
     btn = (Button) findViewById(R.id.button); 
     mIvCaptureImage = (ImageView) findViewById(R.id.imageview1); 
     btn.setOnClickListener(new OnClickListener() { 

      @SuppressWarnings("deprecation") 
      @Override 
      public void onClick(View v) { 
       if (camera != null) { 
        camera.takePicture(myShutterCallback, 
          myPictureCallback_RAW, myPictureCallback_JPG); 

       } 

      } 
     }); 

    } 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    @SuppressWarnings("deprecation") 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
     // TODO Auto-generated method stub 
     if (cameraview) { 
      camera.stopPreview(); 
      cameraview = false; 
     } 

     if (camera != null) { 
      try { 
       setCameraDisplayOrientation(this, 
         CameraInfo.CAMERA_FACING_BACK, camera); 
       camera.setPreviewDisplay(surfaceHolder); 
       camera.startPreview(); 
       cameraview = true; 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    @TargetApi(Build.VERSION_CODES.GINGERBREAD) 
    @SuppressWarnings("deprecation") 
    private void setCameraDisplayOrientation(Activity activity, int cameraId, 
      android.hardware.Camera camera) { 
     android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
     android.hardware.Camera.getCameraInfo(cameraId, info); 
     int rotation = activity.getWindowManager().getDefaultDisplay() 
       .getRotation(); 
     int degrees = 0; 
     switch (rotation) { 
     case Surface.ROTATION_0: 
      degrees = 0; 
      break; 
     case Surface.ROTATION_90: 
      degrees = 90; 
      break; 
     case Surface.ROTATION_180: 
      degrees = 180; 
      break; 
     case Surface.ROTATION_270: 
      degrees = 270; 
      break; 
     } 

     int result; 
     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
      result = (info.orientation + degrees) % 360; 
      result = (360 - result) % 360; // compensate the mirror 
     } else { // back-facing 
      result = (info.orientation - degrees + 360) % 360; 
     } 
     camera.setDisplayOrientation(result); 
    } 

    ShutterCallback myShutterCallback = new ShutterCallback() { 

     public void onShutter() { 
      // TODO Auto-generated method stub 
     } 
    }; 

    PictureCallback myPictureCallback_RAW = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
      // TODO Auto-generated method stub 

     } 
    }; 

    PictureCallback myPictureCallback_JPG = new PictureCallback() { 

     @Override 
     public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
      // TODO Auto-generated method stub 
      Rect rc = getViewPositionRelative(); 
      Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, 
        data.length); 
      Matrix mat = new Matrix(); 
      mat.postRotate(90); 
      Bitmap correctBmp = Bitmap.createBitmap(bitmapPicture, rc.left, 
        rc.top, ImgContainer.getWidth(), ImgContainer.getHeight(), 
        mat, true); 
      // Bitmap circularBitmap = ImageConverter.getRoundedCornerBitmap(
      // correctBmp, 100); 
      mIvCaptureImage.setImageBitmap(correctBmp); 
     } 
    }; 

    public Rect getViewPositionRelative() { 
     // Locate on screen 
     int[] location = new int[2]; 
     ImgContainer.getLocationOnScreen(location); 

     Rect rect = new Rect(); 
     rect.left = location[0]; 
     rect.top = location[1]; 
     rect.right = rect.left + ImgContainer.getWidth(); 
     rect.bottom = rect.top + ImgContainer.getHeight(); 
     return rect; 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     camera = Camera.open(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
     cameraview = false; 
    } 
} 

द्वितीय कार्य: - -:

PictureCallback myPictureCallback_JPG = new PictureCallback() { 

    @Override 
    public void onPictureTaken(byte[] data, android.hardware.Camera camera) { 
     Boolean isSDPresent = android.os.Environment 
       .getExternalStorageState().equals(
         android.os.Environment.MEDIA_MOUNTED); 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
       Locale.getDefault()).format(new Date()); 

     // checking for SD card 
     if (isSDPresent) { 
      mediaStorageDir = new File(Environment 
        .getExternalStorageDirectory().getAbsolutePath(), 
        IMAGE_DIRECTORY_NAME); 

      mediaFile = new File(mediaStorageDir.getPath() + File.separator 
        + "IMG_" + timeStamp + ".jpg"); 

      // Create the storage directory if it does not exist 
      if (!mediaStorageDir.exists()) { 
       if (!mediaStorageDir.mkdirs()) { 
       } 
      } 

      try { 
       Bitmap userImage = BitmapFactory.decodeByteArray(data, 0, 
         data.length); 

       // set file out stream 
       FileOutputStream out = new FileOutputStream(mediaFile); 
       // set compress format quality and stream 
       userImage.compress(Bitmap.CompressFormat.JPEG, 100, out); 

       ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
       userImage.compress(Bitmap.CompressFormat.JPEG, 100, baos); 

       try { 
        out.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } else { 
      Toast.makeText(getApplicationContext(), 
        "Please insert SD card !", Toast.LENGTH_LONG).show(); 

     } 
     if (mediaStorageDir.exists()) { 
      getPathOfCapturedImage(); 
     } 

    } 
}; 

private void getPathOfCapturedImage() { 
    final String ImagePath = mediaFile.getAbsolutePath(); 
    Bitmap bitmap = BitmapFactory.decodeFile(ImagePath); 

    int bitWidth = bitmap.getWidth(); 
    int bitHeight = bitmap.getHeight(); 

    // 3. Size of camera preview on screen 
    int preWidth = surfaceView.getWidth(); 
    int preHeight = surfaceView.getHeight(); 

    Rect rc = getViewPositionRelative(); 
    Matrix mat = new Matrix(); 
    mat.postRotate(90); 

    int startx = rc.left * bitWidth/preWidth; 
    int starty = rc.top * bitHeight/preHeight; 
    int endx = rc.right * bitWidth/preWidth; 
    int endy = rc.bottom * bitHeight/preHeight; 

    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, startx, starty, 
      endx, endy); 
    mIvCaptureImage.setImageBitmap(resizedBitmap); 
} 

public Rect getViewPositionRelative() { 
    // Locate on screen 
    int[] location = new int[2]; 
    ImgContainer.getLocationOnScreen(location); 

    Rect rect = new Rect(); 
    rect.left = location[0]; 
    rect.top = location[1]; 
    rect.right = rect.left - ImgContainer.getWidth(); 
    rect.bottom = rect.top - ImgContainer.getHeight(); 
    return rect; 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    camera = Camera.open(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    // TODO Auto-generated method stub 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
    cameraview = false; 
} 

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:orientation="vertical" > 
 

 
    <FrameLayout 
 
     android:id="@+id/view" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="0dp" 
 
     android:layout_weight=".6" > 
 

 
     <SurfaceView 
 
      android:id="@+id/camera_preview" 
 
      android:layout_width="match_parent" 
 
      android:layout_height="match_parent" /> 
 

 
     <ImageView 
 
      android:id="@+id/Img_container" 
 
      android:layout_width="wrap_content" 
 
      android:layout_height="wrap_content" 
 
      android:layout_gravity="center" 
 
      android:background="@drawable/eclipce"/> 
 
    </FrameLayout> 
 

 
    <ImageView 
 
     android:id="@+id/imageview1" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="0dp" 
 
     android:layout_weight=".2" /> 
 

 
    <LinearLayout 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="0dp" 
 
     android:layout_gravity="center" 
 
     android:layout_weight=".2" 
 
     android:orientation="horizontal" > 
 

 
     <Button 
 
      android:id="@+id/button" 
 
      android:layout_width="wrap_content" 
 
      android:layout_height="wrap_content" 
 
      android:layout_gravity="center" 
 
      android:text="Capture" /> 
 
    </LinearLayout> 
 

 
</LinearLayout>

इसलिए कृपया, मैं एफ किसी को कुछ भी जानता है, मुझे बताओ।

धन्यवाद

+0

ऊपर सवाल पर कोई मदद ... मैं पिछले दो दिनों से अटक कर रहा हूँ .. । कोई सुझाव मेरे लिए जीवन की बचत होगी ... कृपया मुझे मार्गदर्शन करें .. – Siddharth

+0

सबसे पहले, आपकी समस्या के लिए बहुत सारे अप्रासंगिक कोड हैं, अपने प्रश्न को सरल रखने की कोशिश करें, यह देखना मुश्किल है कि कहां देखना है। दूसरा, 'बिटमैप' googling कोशिश करें। आपको सबसे पहले मूल छवि को सहेजने की ज़रूरत है, फिर 'बिटमैप' को फसल करें, इसलिए यह गोलाकार (या अंडाकार) है, फिर इसे सहेजें, फिर मूल छवि को हटाएं, फिर गोलाकार छवि या उन पंक्तियों के साथ कुछ दिखाएं। एचटीएच – NecipAllef

+0

अरे @ नीप्स एलेफ, आपके उत्तर के लिए धन्यवाद और हाँ दूसरे दृष्टिकोण में मैं एक ही काम करने की कोशिश कर रहा हूं, मैं पहली बार छवि को सहेज रहा हूं और फिर बिटमैप को फिर से आकार दे रहा हूं, लेकिन मुझे लगता है कि मैं स्टार्टक्स, स्टार्टी, एंड में कहीं गलत हो रहा हूं एक्स, एंड वाई मान ... इसलिए मैं उस पर ध्यान केंद्रित कर रहा हूं ... – Siddharth

उत्तर

1

इस के साथ खेल रहा है। यहां बताया गया है कि मैंने इसे कैसे हल किया:

1) बस तस्वीर को अपने सभी शानदार पिक्स के साथ लें। हां, यह वही तरीका है जब आप चाहते हैं।

2) अपने ओवरले के अनुपात प्राप्त करें। अब आप जानते हैं कि फसल कहाँ है।

3) कंप्यूटर को हार्ड गणना करने का काम करने दें, यह अच्छा है।

मेरे - पूरा नहीं - कोड: (इसके कुछ हिस्सों तो यह एक आयत फ़ोटो के ऊपर खींचता काट-छांट करने)

ArrayList<int []> userPoints = new ArrayList<>(); 

/** 
* Method to Crop the image 
* 
* @param width    Width of the output image, in mm. 
* @param height   Height of the output image, in mm. 
*/ 
private void cropImage(int width, int height) { 
    Paint paint = new Paint(); 
    paint.setAntiAlias(false); 
    paint.setFilterBitmap(false); 

    int output_width_start = 0; 
    int output_width_end = (width * 5)/2; 
    int output_height_start = 0; 
    int output_height_end = (height * 5)/2; 

    Matrix matrix = new Matrix(); 
    matrix.setPolyToPoly(
      // where to take it from 
      new float[]{ 
        userPoints.get(0)[0], userPoints.get(0)[1], 
        userPoints.get(1)[0], userPoints.get(1)[1], 
        userPoints.get(2)[0], userPoints.get(2)[1], 
        userPoints.get(3)[0], userPoints.get(3)[1]}, 
      0, 
      // what it should be 
      new float[]{ 
        output_width_start, output_height_start, 
        output_width_end, output_width_start, 
        output_width_end, output_height_end, 
        output_height_start, output_height_end}, 
      0, 4); 

    Uri image_uri = Uri.fromFile(file); // get where the temp is stored 
    Bitmap bitmap = BitmapFactory.decodeFile(image_uri.getPath()); 
    canvasRectangle.drawBitmap(bitmap, matrix, paint); 
} 

private void scaleImage(ImageView image) { 
    Matrix matrix = image.getImageMatrix(); 
    RectF drawableRect = new RectF(userPoints.get(0)[0], userPoints.get(0)[1], 400, 300); 
    RectF viewRect = new RectF(0, 0, imageViewPhoto.getWidth(), imageViewPhoto.getHeight()); 
    matrix.setRectToRect(drawableRect, viewRect, Matrix.ScaleToFit.CENTER); 
    imageViewPhoto.setImageMatrix(matrix); 
} 
+0

क्या आप इसे समझा सकते हैं, मैंने ऊपर दिए गए मेरे कोड का उल्लेख किया है, मैं वास्तव में आज भी ऐसा करने में सक्षम नहीं हूं, कृपया मुझे अधिक जानकारी दें, कब और कहां स्केल करें Image (ImageView image) और उपरोक्त कोड से आप देख सकते हैं मुझे बिटमैप बिटमैप मिल रहा हैचित्र, अब अगर मैं आपके वर्णित फ़ंक्शन फसल इमेज (int चौड़ाई, int ऊंचाई) के अंदर चित्र की ऊंचाई और चौड़ाई को पार कर रहा हूं, तो मुझे उपयोगकर्ता_पॉइंट्स और कैनवास रेक्टंगल में क्या नहीं मिल रहा है .. मैं उलझन में हूं, कृपया मेरी मदद करें यहाँ से बाहर – Siddharth

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

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