마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

크롭후 저장한 BMP 파일저장후 알파값

0 추천


	public void onClick(View v) {

		

				String mFileName = "face.bmp";
				String savePath = Environment.getExternalStorageDirectory()
						.getAbsolutePath() + "/" + mFileName;

				Bitmap resized = resizeBitmap(croppedImage);

				try {
					OutputStream stream = new FileOutputStream(savePath);
					// Bitmap testBitmap = BitmapFactory.decodeFile(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);


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);
	}









BITMAP UTIL 
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;
	}
}

크롭하고난 후 bmp 로 저장후에 bmp 이미지를 다음 엑티비티에 넘겨주면 배경이 검은색으로나오구요 저장된 bmp 도 배경색이고 png로 저장하면 compressformat 해서 하면 하얀색 배경이 나옵니다 저는 하얀색배경이 나와야대거든요.한번 봐주시면 감사하겠습니다 아 그리고 비트맵 BMP 로 바꾸는 소스도 첨부해놓겠습니다 GITHUB.COM 에있는 소스를 가져다썻구요 여기서 배경이 왜 검은색이 되는지모르겟네요 하얀색이 나와야대는데 그전에 png 로 크롭햇을댄 검은색으로 잘나왓습니다.ㅠㅠ

안드로이드찢어 (1,080 포인트) 님이 2015년 3월 18일 질문
안드로이드찢어님이 2015년 3월 18일 수정

1개의 답변

0 추천
질문을 이해 못하겠는데..png파일로 크롭했을 땐 배경색이 "하얀색"이었는데,

bmp파일로 크롭하면 배경색이 "검은색"이 된다는건가요?

png에서 하얀색인 배경에만 한해서 bmp에서 검은색으로 바뀐다는 것인지..?

이미지들 중에서 투명배경일 때 하얀색으로 표시되는 경우도 있고

검은색으로 표시되는 경우도 있다고 하더라구요. 투명도는 확인해보셨나요?

저도 bmp 파일 변환하면서 배경색이 바뀌는 경우는 못봤거든요. [대부분 갤러리 내 직접 찍은 사진을 이용해서]
anci (19,950 포인트) 님이 2015년 3월 18일 답변
크롭하고난 후 bmp 로 저장후에 bmp 이미지를 다음 엑티비티에 넘겨주면 배경이 검은색으로나오구요 저장된 bmp 도 배경색이구요

png로 저장하면 compressformat 해서 하면 하얀색 배경이 나오구요
저는 하얀색 배경을 원하거든요
String mFileName = "face.bmp";
                String savePath = Environment.getExternalStorageDirectory()
                        .getAbsolutePath() + "/" + mFileName;

                // 이미지 크기 변경: 한줄이면 끝

                Bitmap resized = resizeBitmap(croppedImage);
                try {
                    OutputStream stream = new FileOutputStream(savePath);
                    // Bitmap testBitmap = BitmapFactory.decodeFile(savePath);
                    BitmapUtils bmpUtil = new BitmapUtils();
                    boolean isSaveResult = bmpUtil.save(resized, savePath);
                    // resized.compress(CompressFormat.BMP, 100, stream);

                    stream.close();
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

이 경우에는 크롭후에 검은색 배경이 생기구요


    Bitmap resized = resizeBitmap(croppedImage);
                try {
                    OutputStream stream = new FileOutputStream(savePath);
               
                     resized.compress(CompressFormat.PNG, 100, stream);

                    stream.close();
                } catch (FileNotFoundException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

이경우에는 하얀색 배경이 됩니다.
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);
    }

    @Override
    public void onBackPressed() {
        moveTaskToBack(true);
    }

이게 RESIZE 비트맵 부분이구요.
...