public void onClick(View v) {
String mFileName = "face.bmp";
String savePath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + "/" + mFileName;
// CROPPEDIMAGE <-- 크롭한 후
Bitmap resized = resizeBitmap(croppedImage);
try {
OutputStream stream = new FileOutputStream(savePath);
BitmapUtils bmpUtil = new BitmapUtils();
boolean isSaveResult = bmpUtil.save(resized, savePath);
stream.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mSaveCropPhotePath = savePath;
Intent intent = new Intent(getApplicationContext(),
Compose.class);
//
//
intent.putExtra("id", id);
intent.putExtra("pw", pw);
intent.putExtra("asdf", movie);
intent.putExtra("uri", mSaveCropPhotePath);
intent.putExtra("bm", mSaveCropPhotePath);
Log.i("LSJ", "========= [compose] 아이디 보냄 ========= :" + id);
Log.i("LSJ", "========= [compose] 비번 보냄 ========= :" + pw);
Log.i("LSJ", "======== [compose] 사진 보냄 ========:"
+ mSaveCropPhotePath);
Log.i("LSJ", "========= [compose] 동영상보냄 ========= :" + movie);
startActivity(intent);
finish();
}
});
}
public Bitmap resizeBitmap(Bitmap source) {
Bitmap rbm = resizeBitmapImage(source, 256);
Bitmap output = Bitmap.createBitmap(256, 256, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
int utop = 0;
int h = rbm.getHeight();
if (h < 256) {
utop = 256 - h;
utop = utop / 2;
}
int uleft = 0;
int w = rbm.getWidth();
if (w < 256) {
uleft = 256 - w;
uleft = uleft / 2;
}
canvas.drawBitmap(rbm, uleft, utop, new Paint());
return output;
}
public Bitmap resizeBitmapImage(Bitmap source, int maxResolution) {
int width = source.getWidth();
int height = source.getHeight();
int newWidth = width;
int newHeight = height;
float rate = 0.0f;
if (width > height) {
if (maxResolution < width) {
rate = maxResolution / (float) width;
newHeight = (int) (height * rate);
newWidth = maxResolution;
}
} else {
if (maxResolution < height) {
rate = maxResolution / (float) height;
newWidth = (int) (width * rate);
newHeight = maxResolution;
}
}
return Bitmap.createScaledBitmap(source, newWidth, newHeight, true);
}
이미지 크롭후에 bmp 파일로 저장하는 부분입니다. 타원으로 크롭후에 크롭부분은 잘나타납니다 근데 배경 알파값이 검은색으로 변하네요 .png 로 했을경우에는 하얀색배경이 나타납니다. 밑에는 bmp 파일 변환하는 부분입니다.
bmp 파일 변환
package com.example.mstar;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import android.graphics.Bitmap;
/**
* Android Bitmap Object to .bmp image (Windows BMP v3 24bit) file util class
*
* ref : http://en.wikipedia.org/wiki/BMP_file_format
*
* @author ultrakain ( ultrasonic@gmail.com )
* @since 2012-09-27
*
*/
public class BitmapUtils {
private final int BMP_WIDTH_OF_TIMES = 4;
private final int BYTE_PER_PIXEL = 3;
/**
* Android Bitmap Object to Window's v3 24bit Bmp Format File
* @param orgBitmap
* @param filePath
* @return file saved result
*/
public boolean save(Bitmap orgBitmap, String filePath){
if(orgBitmap == null){
return false;
}
if(filePath == null){
return false;
}
boolean isSaveSuccess = true;
//image size
int width = orgBitmap.getWidth();
int height = orgBitmap.getHeight();
//image dummy data size
//reason : bmp file's width equals 4's multiple
int dummySize = 0;
byte[] dummyBytesPerRow = null;
boolean hasDummy = false;
if(isBmpWidth4Times(width)){
hasDummy = true;
dummySize = BMP_WIDTH_OF_TIMES - (width % BMP_WIDTH_OF_TIMES);
dummyBytesPerRow = new byte[dummySize * BYTE_PER_PIXEL];
for(int i = 0; i < dummyBytesPerRow.length; i++){
dummyBytesPerRow[i] = (byte)0xFF;
}
}
int[] pixels = new int[width * height];
int imageSize = pixels.length * BYTE_PER_PIXEL + (height * dummySize * BYTE_PER_PIXEL);
int imageDataOffset = 0x36;
int fileSize = imageSize + imageDataOffset;
//Android Bitmap Image Data
orgBitmap.getPixels(pixels, 0, width, 0, 0, width, height);
//ByteArrayOutputStream baos = new ByteArrayOutputStream(fileSize);
ByteBuffer buffer = ByteBuffer.allocate(fileSize);
try {
/**
* BITMAP FILE HEADER Write Start
**/
buffer.put((byte)0x42);
buffer.put((byte)0x4D);
//size
buffer.put(writeInt(fileSize));
//reserved
buffer.put(writeShort((short)0));
buffer.put(writeShort((short)0));
//image data start offset
buffer.put(writeInt(imageDataOffset));
/** BITMAP FILE HEADER Write End */
//*******************************************
/** BITMAP INFO HEADER Write Start */
//size
buffer.put(writeInt(0x28));
//width, height
buffer.put(writeInt(width));
buffer.put(writeInt(height));
//planes
buffer.put(writeShort((short)1));
//bit count
buffer.put(writeShort((short)24));
//bit compression
buffer.put(writeInt(0));
//image data size
buffer.put(writeInt(imageSize));
//horizontal resolution in pixels per meter
buffer.put(writeInt(0));
//vertical resolution in pixels per meter (unreliable)
buffer.put(writeInt(0));
//컬러 사용 유무
buffer.put(writeInt(0));
//중요하게 사용하는 색
buffer.put(writeInt(0));
/** BITMAP INFO HEADER Write End */
int row = height;
int col = width;
int startPosition = 0;
int endPosition = 0;
while( row > 0 ){
startPosition = (row - 1) * col;
endPosition = row * col;
for(int i = startPosition; i < endPosition; i++ ){
buffer.put(write24BitForPixcel(pixels[i]));
if(hasDummy){
if(isBitmapWidthLastPixcel(width, i)){
buffer.put(dummyBytesPerRow);
}
}
}
row--;
}
FileOutputStream fos = new FileOutputStream(filePath);
fos.write(buffer.array());
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
isSaveSuccess = false;
}
finally{
}
return isSaveSuccess;
}
/**
* Is last pixel in Android Bitmap width
* @param width
* @param i
* @return
*/
private boolean isBitmapWidthLastPixcel(int width, int i) {
return i > 0 && (i % (width - 1)) == 0;
}
/**
* BMP file is a multiples of 4?
* @param width
* @return
*/
private boolean isBmpWidth4Times(int width) {
return width % BMP_WIDTH_OF_TIMES > 0;
}
/**
* Write integer to little-endian
* @param value
* @return
* @throws IOException
*/
private byte[] writeInt(int value) throws IOException {
byte[] b = new byte[4];
b[0] = (byte)(value & 0x000000FF);
b[1] = (byte)((value & 0x0000FF00) >> 8);
b[2] = (byte)((value & 0x00FF0000) >> 16);
b[3] = (byte)((value & 0xFF000000) >> 24);
return b;
}
/**
* Write integer pixel to little-endian byte array
* @param value
* @return
* @throws IOException
*/
private byte[] write24BitForPixcel(int value) throws IOException {
byte[] b = new byte[3];
b[0] = (byte)(value & 0x000000FF);
b[1] = (byte)((value & 0x0000FF00) >> 8);
b[2] = (byte)((value & 0x00FF0000) >> 16);
return b;
}
/**
* Write short to little-endian byte array
* @param value
* @return
* @throws IOException
*/
private byte[] writeShort(short value) throws IOException {
byte[] b = new byte[2];
b[0] = (byte)(value & 0x00FF);
b[1] = (byte)((value & 0xFF00) >> 8);
return b;
}
}