मैं इस सरल ऐप को विकसित करने की कोशिश कर रहा हूं जो चित्र लेता है। सब कुछ ठीक है। मेरे पास पूर्वावलोकन के केंद्र में निश्चित आकार अंडाकार आकार छविदृश्य है। छवि का अनुकूलन ठीक काम कर रहा है लेकिन समस्या है, मैं छवि को कैप्चर करना चाहता हूं और अंडाकार आकार वाले छविदृश्य के अंदर स्वचालित रूप से इसे फसल करना चाहता हूं। मैं नहीं करता पूरी छवि को सहेजना चाहते हैं, मैं सिर्फ छवि के हिस्से को चाहता हूं जो आकार के अंदर स्थित है। अब, मुझे नहीं पता कि कैसे आगे बढ़ना है। समाधान के लिए 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>
इसलिए कृपया, मैं एफ किसी को कुछ भी जानता है, मुझे बताओ।
धन्यवाद
ऊपर सवाल पर कोई मदद ... मैं पिछले दो दिनों से अटक कर रहा हूँ .. । कोई सुझाव मेरे लिए जीवन की बचत होगी ... कृपया मुझे मार्गदर्शन करें .. – Siddharth
सबसे पहले, आपकी समस्या के लिए बहुत सारे अप्रासंगिक कोड हैं, अपने प्रश्न को सरल रखने की कोशिश करें, यह देखना मुश्किल है कि कहां देखना है। दूसरा, 'बिटमैप' googling कोशिश करें। आपको सबसे पहले मूल छवि को सहेजने की ज़रूरत है, फिर 'बिटमैप' को फसल करें, इसलिए यह गोलाकार (या अंडाकार) है, फिर इसे सहेजें, फिर मूल छवि को हटाएं, फिर गोलाकार छवि या उन पंक्तियों के साथ कुछ दिखाएं। एचटीएच – NecipAllef
अरे @ नीप्स एलेफ, आपके उत्तर के लिए धन्यवाद और हाँ दूसरे दृष्टिकोण में मैं एक ही काम करने की कोशिश कर रहा हूं, मैं पहली बार छवि को सहेज रहा हूं और फिर बिटमैप को फिर से आकार दे रहा हूं, लेकिन मुझे लगता है कि मैं स्टार्टक्स, स्टार्टी, एंड में कहीं गलत हो रहा हूं एक्स, एंड वाई मान ... इसलिए मैं उस पर ध्यान केंद्रित कर रहा हूं ... – Siddharth