public static boolean save(Bitmap orgBitmap,String filePath) throws IOException {
  long start=System.currentTimeMillis();
  if (orgBitmap == null) {
    return false;
  }
  if (filePath == null) {
    return false;
  }
  boolean isSaveSuccess=true;
  int width=orgBitmap.getWidth();
  int height=orgBitmap.getHeight();
  byte[] dummyBytesPerRow=null;
  boolean hasDummy=false;
  int rowWidthInBytes=BYTE_PER_PIXEL * width;
  if (rowWidthInBytes % BMP_WIDTH_OF_TIMES > 0) {
    hasDummy=true;
    dummyBytesPerRow=new byte[(BMP_WIDTH_OF_TIMES - (rowWidthInBytes % BMP_WIDTH_OF_TIMES))];
    for (int i=0; i < dummyBytesPerRow.length; i++) {
      dummyBytesPerRow[i]=(byte)0xFF;
    }
  }
  int[] pixels=new int[width * height];
  int imageSize=(rowWidthInBytes + (hasDummy ? dummyBytesPerRow.length : 0)) * height;
  int imageDataOffset=0x36;
  int fileSize=imageSize + imageDataOffset;
  orgBitmap.getPixels(pixels,0,width,0,0,width,height);
  ByteBuffer buffer=ByteBuffer.allocate(fileSize);
  buffer.put((byte)0x42);
  buffer.put((byte)0x4D);
  buffer.put(writeInt(fileSize));
  buffer.put(writeShort((short)0));
  buffer.put(writeShort((short)0));
  buffer.put(writeInt(imageDataOffset));
  buffer.put(writeInt(0x28));
  buffer.put(writeInt(width + (hasDummy ? (dummyBytesPerRow.length == 3 ? 1 : 0) : 0)));
  buffer.put(writeInt(height));
  buffer.put(writeShort((short)1));
  buffer.put(writeShort((short)24));
  buffer.put(writeInt(0));
  buffer.put(writeInt(imageSize));
  buffer.put(writeInt(0));
  buffer.put(writeInt(0));
  buffer.put(writeInt(0));
  buffer.put(writeInt(0));
  int row=height;
  int col=width;
  int startPosition=(row - 1) * col;
  int endPosition=row * col;
  while (row > 0) {
    for (int i=startPosition; i < endPosition; i++) {
      buffer.put((byte)(pixels[i] & 0x000000FF));
      buffer.put((byte)((pixels[i] & 0x0000FF00) >> 8));
      buffer.put((byte)((pixels[i] & 0x00FF0000) >> 16));
    }
    if (hasDummy) {
      buffer.put(dummyBytesPerRow);
    }
    row--;
    endPosition=startPosition;
    startPosition=startPosition - col;
  }
  FileOutputStream fos=new FileOutputStream(filePath);
  fos.write(buffer.array());
  fos.close();
  Log.v("AndroidBmpUtil",System.currentTimeMillis() - start + " ms");
  return isSaveSuccess;
}

public static boolean save ( Bitmap orgBitmap , String filePath ) throws IOException { long start = System . currentTimeMillis ( ) ; if ( orgBitmap == null ) { return false ; } if ( filePath == null ) { return false ; } boolean isSaveSuccess = true ; int width = orgBitmap . getWidth ( ) ; int height = orgBitmap . getHeight ( ) ; byte [ ] dummyBytesPerRow = null ; boolean hasDummy = false ; int rowWidthInBytes = BYTE_PER_PIXEL * width ; if ( rowWidthInBytes % BMP_WIDTH_OF_TIMES > 0 ) { hasDummy = true ; dummyBytesPerRow = new byte [ ( BMP_WIDTH_OF_TIMES - ( rowWidthInBytes % BMP_WIDTH_OF_TIMES ) ) ] ; for ( int i = 0 ; i < dummyBytesPerRow . length ; i ++ ) { dummyBytesPerRow [ i ] = ( byte ) 0xFF ; } } int [ ] pixels = new int [ width * height ] ; int imageSize = ( rowWidthInBytes + ( hasDummy ? dummyBytesPerRow . length : 0 ) ) * height ; int imageDataOffset = 0x36 ; int fileSize = imageSize + imageDataOffset ; orgBitmap . getPixels ( pixels , 0 , width , 0 , 0 , width , height ) ; ByteBuffer buffer = ByteBuffer . allocate ( fileSize ) ; buffer . put ( ( byte ) 0x42 ) ; buffer . put ( ( byte ) 0x4D ) ; buffer . put ( writeInt ( fileSize ) ) ; buffer . put ( writeShort ( ( short ) 0 ) ) ; buffer . put ( writeShort ( ( short ) 0 ) ) ; buffer . put ( writeInt ( imageDataOffset ) ) ; buffer . put ( writeInt ( 0x28 ) ) ; buffer . put ( writeInt ( width + ( hasDummy ? ( dummyBytesPerRow . length == 3 ? 1 : 0 ) : 0 ) ) ) ; buffer . put ( writeInt ( height ) ) ; buffer . put ( writeShort ( ( short ) 1 ) ) ; buffer . put ( writeShort ( ( short ) 24 ) ) ; buffer . put ( writeInt ( 0 ) ) ; buffer . put ( writeInt ( imageSize ) ) ; buffer . put ( writeInt ( 0 ) ) ; buffer . put ( writeInt ( 0 ) ) ; buffer . put ( writeInt ( 0 ) ) ; buffer . put ( writeInt ( 0 ) ) ; int row = height ; int col = width ; int startPosition = ( row - 1 ) * col ; int endPosition = row * col ; while ( row > 0 ) { for ( int i = startPosition ; i < endPosition ; i ++ ) { buffer . put ( ( byte ) ( pixels [ i ] & 0x000000FF ) ) ; buffer . put ( ( byte ) ( ( pixels [ i ] & 0x0000FF00 ) > > 8 ) ) ; buffer . put ( ( byte ) ( ( pixels [ i ] & 0x00FF0000 ) > > 16 ) ) ; } if ( hasDummy ) { buffer . put ( dummyBytesPerRow ) ; } row -- ; endPosition = startPosition ; startPosition = startPosition - col ; } FileOutputStream fos = new FileOutputStream ( filePath ) ; fos . write ( buffer . array ( ) ) ; fos . close ( ) ; Log . v ( "AndroidBmpUtil" , System . currentTimeMillis ( ) - start + " ms" ) ; return isSaveSuccess ; }
android bitmap object to window ' s v3 24bit bmp format file
