메인에서 디바이스 내부 이미지 긁어오고 긁어온 이미지 클릭하면 편집부로 넘어가는거 짤려고 하는데 캔버스에서 이미지를 출력이 안되네요 ㅠㅠ
로그입니다 ㅠ
10-21 16:19:39.316 13580-13580/com.example.user.viewediter E/BitmapFactory+ Unable to decode stream: java.io.FileNotFoundException: _id: open failed: ENOENT (No such file or directory)
10-21 16:19:39.316 13580-13580/com.example.user.viewediter D/AndroidRuntime+ Shutting down VM
10-21 16:19:39.321 13580-13580/com.example.user.viewediter E/AndroidRuntime+ FATAL EXCEPTION: main
Process: com.example.user.viewediter, PID: 13580
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at com.example.user.viewediter.editPage$MyGraphicView.onDraw(editPage.java:78)
at android.view.View.draw(View.java:16203)
at android.view.View.updateDisplayListIfDirty(View.java:15126)
at android.view.View.getDisplayList(View.java:15149)
at android.view.View.draw(View.java:15924)
at android.view.ViewGroup.drawChild(ViewGroup.java:3703)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)
at android.view.View.updateDisplayListIfDirty(View.java:15121)
at android.view.View.getDisplayList(View.java:15149)
at android.view.View.draw(View.java:15924)
at android.view.ViewGroup.drawChild(ViewGroup.java:3703)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)
at android.view.View.updateDisplayListIfDirty(View.java:15121)
at android.view.View.getDisplayList(View.java:15149)
at android.view.View.draw(View.java:15924)
at android.view.ViewGroup.drawChild(ViewGroup.java:3703)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)
at android.view.View.updateDisplayListIfDirty(View.java:15121)
at android.view.View.getDisplayList(View.java:15149)
at android.view.View.draw(View.java:15924)
at android.view.ViewGroup.drawChild(ViewGroup.java:3703)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)
at android.view.View.updateDisplayListIfDirty(View.java:15121)
at android.view.View.getDisplayList(View.java:15149)
at android.view.View.draw(View.java:15924)
at android.view.ViewGroup.drawChild(ViewGroup.java:3703)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3497)
at android.view.View.draw(View.java:16206)
at android.widget.FrameLayout.draw(FrameLayout.java:592)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2932)
at android.view.View.updateDisplayListIfDirty(View.java:15126)
at android.view.View.getDisplayList(View.java:15149)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:275)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:281)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:320)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:2751)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2584)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2176)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1191)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6642)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5951)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
<!--[if !supportEmptyParas]--> <!--[endif]-->
메인
package com.example.user.viewediter;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import java.util.ArrayList;
public class MainActivity extends Activity {
//cursor and columnIndex defined Globally so we can use it in below class.
static Cursor cursor;
static int columnIndex;
static int imageID;
static Uri uri;
static String[] list1;
static String[] list2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("이미지 리스트 표시");
//Searching Images ID's from Gallery. _ID is the Default id code for all. You can retrive image,contacts,music id in the same way.
// 갤러리에서 이미지 ID를 검색. _ID는 모든 기본 ID 코드입니다. 동일한 방식으로 화상, 연락처, 곡 ID를 검색 할 수있다.
list1 = new String[]{MediaStore.Images.Media._ID};
list2 = new String[]{MediaStore.Images.Media.DATA};
//Retriving Images from Database(SD CARD) by Cursor.
cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, list1, null, null, MediaStore.Images.Media._ID);
columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media._ID);
GridView sdcardimage = (GridView) findViewById(R.id.gridview);
ImageAdapter adapter=new ImageAdapter(this);
sdcardimage.setAdapter(adapter);
}
// Adapter for Grid View
private class ImageAdapter extends BaseAdapter {
private Context context;
public ImageAdapter(Context localContext) {
context = localContext;
}
public int getCount() {
return cursor.getCount();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = new ViewHolder();
// 캐시된 뷰가 없을 경우 새로 생성하고 뷰홀더를 생성한다
if (convertView == null) {
holder.picturesView = new ImageView(context);
//Converting the Row Layout to be used in Grid View
convertView = getLayoutInflater().inflate(R.layout.row, parent, false);
//You can convert Layout in this Way with the Help of View Stub. View Stub is newer. Read about ViewStub.Inflate and its parameter.
//convertView= ViewStub.inflate(context,R.layout.row,null);
convertView.setTag(holder);
// 캐시된 뷰가 있을 경우 저장된 뷰홀더를 사용한다
} else {
holder = (ViewHolder) convertView.getTag();
}
cursor.moveToPosition(position);
imageID = cursor.getInt(columnIndex);
//In Uri "" + imageID is to convert int into String as it only take String Parameter and imageID is in Integer format.
//You can use String.valueOf(imageID) instead.
//추가된 ID를 보유한 Uri 객체를 리턴하는 static 메소드
uri = Uri.withAppendedPath(
MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, "" + imageID);
//Setting Image to View Holder Image View.
holder.picturesView = (ImageView) convertView.findViewById(R.id.imageview);
//holder.picturesView.setLayoutParams(new GridView.LayoutParams(100,150));
holder.picturesView.setImageURI(uri);
holder.picturesView.setScaleType(ImageView.ScaleType.CENTER_CROP);
holder.picturesView.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), editPage.class);
intent.putExtra("List", list1);
intent.putExtra("ColumIndex", columnIndex);
startActivity(intent);
}
});
return convertView;
}
// View Holder pattern used for Smooth Scrolling. As View Holder pattern recycle the findViewById() object.
class ViewHolder {
private ImageView picturesView;
}
}
}
그리고 편집부분입니다.
public class editPage extends Activity {
MyGraphicView graphicView; // 선택된 이미지 출력
int curNum; // 현재 파일에 순서상 지정된 번호
String[] imageFiles; // 파일들의 위치
ImageButton ibZoomin, ibZoomout, ibRotate, ibBright, ibDark, ibGray;
static float scaleX = 1, scaleY = 1;
static float angle = 0;
static float color = 1;
static float satur = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_field);
setTitle("이미지 편집");
LinearLayout pictureLayout = (LinearLayout) findViewById(R.id.pictureLayout);
graphicView = (MyGraphicView) new MyGraphicView(this);
pictureLayout.addView(graphicView);
Intent intent = getIntent();
imageFiles = intent.getStringArrayExtra("List"); //인텐트에서 조금 전 이미지 파일 리스트를 전부 받아온다.
curNum = intent.getIntExtra("ColumIndex", 0); //현재 이미지 번호를 가져온다.
//imageFiles = new File("/sdcard/pictures").listFiles();//sd카드 안의 파일들의 배열을 생성
//imageFname = imageFiles[curNum].toString(); // 배열의 1칸에 입력된 이미지의 이름으로 초기화한다.
graphicView.imagePath = imageFiles[curNum]; //이미지 표시
//ImFName.setText(imageFname); // 파일의 이름을 텍스트뷰에 표시한다.
clickIcons();
}
private static class MyGraphicView extends View {
String imagePath = null;
public MyGraphicView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
@Override
protected void onDraw(Canvas canvas) { //캔버스에 이미지를 표시하기 위한 메서드를 작성
super.onDraw(canvas);
if (imagePath != null) {
int cenX = this.getWidth() / 2;
int cenY = this.getHeight() / 2;
canvas.scale(scaleX, scaleY, cenX, cenY);
canvas.rotate(angle, cenX, cenY);
Paint paint = new Paint();
float[] array = { color, 0, 0, 0, 0, 0, color, 0, 0, 0, 0, 0,
color, 0, 0, 0, 0, 0, 1, 0 };
ColorMatrix cm = new ColorMatrix(array);
if (satur == 0)
cm.setSaturation(satur);
paint.setColorFilter(new ColorMatrixColorFilter(cm));
Bitmap picture = decodeFile(imagePath);//imagePath의 값으로 picture의 값을 초기화
int picX = (this.getWidth() - picture.getWidth()) / 2;
int picY = (this.getHeight() - picture.getHeight()) / 2;
canvas.drawBitmap(picture, picX, picY, paint); // picture의 이미지를 화면상에 표시한다.
picture.recycle();
}
}
}
댓글 0