Programming/Android

[안드로이드] 이미지 관련, Bitmap, File, Image 관련 함수 정리

빠릿베짱이 2012. 11. 27. 21:23
반응형

ㅇ 이미지 sdcard에 코드로 저장한 후에 갤러리 갱신 안되는 문제

미디어 스캐너를 이용해야 한다. sd카드에 저장하면 이미지 스캐너가 실행되기전까지는 넣은게 갱신되지않는다

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

o 비트맵(Bitmap)을 파일(File)로 저장하는 함수

private void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath)
    {
    	File fileCacheItem = new File(strFilePath);
    	OutputStream out = null;
    	try
    	{
    		fileCacheItem.createNewFile();
    		out = new FileOutputStream(fileCacheItem);
    		bitmap.compress(CompressFormat.JPEG, 100, out);

    	}
    	catch (Exception e) 
    	{
    		e.printStackTrace();
    	}
    	finally
    	{
    		try
    		{
    			out.close();
    			sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
     		}
    		catch (IOException e)
    		{
    			e.printStackTrace();
    		}
    	}

    }

 o 마스크를 이용하는 방법

 	Bitmap result = Bitmap.createBitmap(m_bmp.getWidth(), m_bmp.getHeight(), Bitmap.Config.ARGB_8888);
	    	
	Canvas c = new Canvas(result);	//화면에 뿌릴 비트맵
	c.drawBitmap(m_bmp, 0, 0, null); //맨 밑에 이미지 그리기
	    	
	    	
	Paint paint2 = new Paint();
	paint2.setFilterBitmap(false);
	paint2.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT) ); //색이 칠해진곳만 불투명?
	//DST_IN으로 변경시 색이 칠해진 부분만 투명
	c.drawBitmap(m_Maskbmp, 0, 0, paint2); // 전경 이미지 위에 마스크 이미지 그림
	               
	paint2.setXfermode(null);
	canvas.drawBitmap(result, srcRect, dstRect, null); // 배경 위에 완성된 전경 이미지를 그림

 o 이미지 파일 mutable로 여는 함수

 
private Bitmap LoadmutableBitmap(String strFilePath)
    {
    	Bitmap bmp;
    	Bitmap oriImage = BitmapFactory.decodeFile(strFilePath);
    	
    	bmp = Bitmap.createBitmap(oriImage.getWidth(),oriImage.getHeight(), Bitmap.Config.ARGB_8888);
    	Canvas mutableBitmapCanvas = new Canvas(bmp);
    	mutableBitmapCanvas.drawBitmap(oriImage,0,0,null);        	        	 
    	    	
    	return bmp;
    }

 o 파일 복사 함수

private boolean copyFile(File file , String save_file){   
    	boolean result; 
    	if(file!=null&&file.exists())
    	{ 
    		try
    		{
    			FileInputStream fis = new FileInputStream(file); 
    			FileOutputStream newfos = new FileOutputStream(save_file);     
    			int readcount=0;              
    			byte[] buffer = new byte[1024];     
    			while((readcount = fis.read(buffer,0,1024))!= -1)
    			{    
    				newfos.write(buffer,0,readcount);  
    				LogMessage("Copy : " + save_file);
    			}             
    			newfos.close();            
    			fis.close();    
    			sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
    		} catch (Exception e) 
    		{               
    			e.printStackTrace();
    		}          
    		result = true;       
    	}
    	else
    	{     
    		result = false;      
    	}        
    	return result;   
    }

URI는 어떤 형태냐면,

content://media/external/images/media/637

이런 형태이고

절대 경로는 /mnt/sdcard/Camera/SH130409-161030.jpg

이렇게 생겼다

o 절대 경로 -> URI 변환.

//imageUrl : 절대 경로를 갖음 String 변수
	Uri fileUri = Uri.parse(imageUrl);
	String filePath = fileUri.getPath();
	Cursor c = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,null,"_data ='" + filePath + "'",null,null);

	c.moveToNext();
	int id = c.getInt(0);
	Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,id);
	Log.e("URI",uri.toString());

 o 비트맵에 GPS 정보 함께 저장하기  관련 정보 링크 : http://android-er.blogspot.kr/2011/04/update-gps-tag-using.html 

		private void SaveBitmapToFileCache(Bitmap bitmap, String strFilePath)
		{
			File fileCacheItem = new File(strFilePath);
			OutputStream out = null;
			try
			{
				fileCacheItem.createNewFile();
				out = new FileOutputStream(fileCacheItem);
				bitmap.compress(CompressFormat.JPEG, 100, out);
		
			}
			catch (Exception e) 
			{
				e.printStackTrace();
			}
			finally
			{
				try
				{
					out.close();
					
					 ExifInterface ef = new ExifInterface(strFilePath);
		  			if(ef != null)
		  			{
			    			Log.e("URI",strFilePath);
			                ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE, "22/1,21/1,299295/32768");
			                ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE,"114/1,3/1,207045/4096");
			                ef.setAttribute(ExifInterface.TAG_GPS_LATITUDE_REF, "N");
			                ef.setAttribute(ExifInterface.TAG_GPS_LONGITUDE_REF, "E");   
			                
			                //Log.e("URI DateTime",ef.getAttribute(ExifInterface.TAG_DATETIME));;
			                ef.saveAttributes();
			                
		  			}
		  			
					sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));
					
					
		            
		 		}
				catch (IOException e)
				{
					e.printStackTrace();
				}
			}
		
		}
반응형