2015-04-05 66 views
0

这是我的课程。在这里我让用户在绘画上绘制一些东西。那么当用户点击菜单栏中的保存选项时,我想将图像保存为图像文件。但是通过此代码,目录不会被创建。将位图转换为图像文件时未创建目录

package com.nisani.sampaint; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.Canvas; 
import android.graphics.Color; 
    import android.graphics.Matrix; 
    import android.graphics.Paint; 
    import android.graphics.PointF; 
    import android.graphics.drawable.BitmapDrawable; 
    import android.graphics.drawable.Drawable; 

    import android.os.Bundle; 
    import android.os.Environment; 
    import android.util.Log; 

    import android.view.Display; 
    import android.view.Menu; 
import android.view.MenuItem; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.view.View.OnTouchListener; 
    import android.view.WindowManager; 
    import android.widget.ImageView; 
    import android.widget.Toast; 

    import java.io.File; 
    import java.io.FileOutputStream; 

    public class MainActivity extends Activity implements OnTouchListener { 
    ImageView imageView; 

    Bitmap bitmap; 
    Canvas canvas; 
static int mImageCount; 
Intent in; 
    Paint paint; 
    float downx = 0, downy = 0, upx = 0, upy = 0; 
    float startX = 0; 
    float startY = 0; 
    float endX = 0; 
    float endY = 0; 
View mView; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

     Toast.makeText(getApplicationContext(), "Rotate the phone to clear screen!!",Toast.LENGTH_SHORT).show(); 
    imageView = (ImageView) this.findViewById(R.id.imageView1); 
    Display currentDisplay = getWindowManager().getDefaultDisplay(); 
    float dw = currentDisplay.getWidth(); 
    float dh = currentDisplay.getHeight(); 
    bitmap = Bitmap.createBitmap((int) dw, (int) dh, 
     Bitmap.Config.ARGB_8888); 
    canvas = new Canvas(bitmap); 
    paint = new Paint(); 
    paint.setColor(Color.BLACK); 
    imageView.setImageBitmap(bitmap); 

    imageView.setOnTouchListener(this); 
    } 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_pattern1, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_home) { 
     return true; 
    } 
    if (id == R.id.action_p1) { 
     in=new Intent(MainActivity.this,Pattern1.class); 
     startActivity(in); 
    } 
    if (id == R.id.action_rect) { 
     in=new Intent(MainActivity.this,Rectangle.class); 
     startActivity(in); 
    } 
    if (id == R.id.action_save) { 


     File myDir=new File("/sdcard/sampaint"); 
     boolean a=myDir.mkdirs(); 
     if(a==true){ 
      Toast.makeText(MainActivity.this,"directory created",Toast.LENGTH_SHORT).show(); 
     } 
     else{ 
      Toast.makeText(MainActivity.this,"directory not created",Toast.LENGTH_SHORT).show(); 
     } 

     mImageCount++; 
     String fname = "image-" + mImageCount + ".jpg"; 
     File file = new File (myDir, fname); 
     if (file.exists()) file.delete(); 
     saveAsJpg (file); 
    } 
    return super.onOptionsItemSelected(item); 
} 
public void saveAsJpg (File f) { 
    String fname = f.getAbsolutePath(); 
    FileOutputStream fos = null; 
    try { 
     fos = new FileOutputStream (f); 
// Take the bitmap of the view and write it out as a jpeg. 
     bitmap.compress (Bitmap.CompressFormat.JPEG, 95, fos); 
    } catch (Throwable ex) { 
     ex.printStackTrace(); 
    } 

} 
public void onBackPressed(){ 

    finish(); 
    super.onBackPressed(); 
} 
public boolean onTouch(View v, MotionEvent event) { 
    int action = event.getAction(); 

    switch (action) {  
    case MotionEvent.ACTION_DOWN: 
     startX=event.getX(); 
     startY=event.getY(); 
     break; 
    case MotionEvent.ACTION_MOVE:   
    endX = event.getX(); 
    endY = event.getY(); 
    canvas.drawLine(startX,startY,endX,endY, paint); 

    imageView.invalidate(); 
    startX=endX; 
    startY=endY; 
    break; 
    case MotionEvent.ACTION_UP: 
     endX = event.getX(); 
     endY = event.getY(); 
     canvas.drawLine(startX,startY,endX,endY, paint); 
     //canvas.drawPaint(paint); 
     imageView.invalidate(); 
    break; 
    case MotionEvent.ACTION_CANCEL: 
    break; 
    default: 
    break; 
    } 
    return true; 
    } 
} 
+0

这是因为您的文件对象无法找到sdcard的路径。您应该使用Environment.getExternalStorageDirectory()+“/ sampaint”来代替使用/ sdcard/sampaint。另外不要忘记在清单文件中写入外部存储权限。 – Aakash 2015-04-05 01:15:38

+0

仍然是同样的问题 – sammalik 2015-04-05 01:24:08

+0

你是否得到任何异常? – Aakash 2015-04-05 01:31:49

回答

0

给出的路径Environment.getExternalStorageDirectory()+ “/ sampaint /” + filename.jpg

或者

做到这一点如下 档案文件=新的文件(Environment.getExternalStorageDirectory( )+“/ sampaint /”,fname);

+0

我已经这样做了。看到代码 – sammalik 2015-04-05 02:02:15

+0

是啊现在它的工作,但只显示空白图像。 – sammalik 2015-04-05 02:13:26

+0

输出流或正在创建的位图可能存在一些问题。谢谢 – Aakash 2015-04-05 02:21:40