bmp不支持alpha,因此encode出来的bmp与源图像有些差别
源码如下:
</pre><pre name="code" class="cpp">#include "SkBitmap.h"
#include "SkStream.h"
#include "SkString.h"
#include "SkImageDecoder.h"
#include "SkImageEncoder.h"
#include "SkUnPreMultiply.h"
#include "SkColorPriv.h"
void encodeBMP2File(const SkBitmap &bm, const char *fileName) {
SkFILEWStream out(fileName);
/*File header*/
char format[2] = {'B','M'};
int fileSize = bm.getSafeSize() + 54;//no color table
int reserve = 0;
int offByte = 54;
/*Info header*/
int infoHeaderSize = 40;
int width = bm.width();
int height = bm.height();
short planes = 1;
short bpp = 32;
int compression = 0;
int imageSize = bm.getSafeSize();
int x = 0;
int y = 0;
int corlorUsed = 0;
int corImportant = 0;
/*data addr*/
//unsigned char *pixel = (unsigned char*) bm.getPixels();
uint32_t *origPixel = (uint32_t *)bm.getPixels();
uint32_t *rmAPixel = (uint32_t *)malloc(imageSize);
uint32_t *srcRow = NULL;
int outPixel;
uint32_t r,g,b,a;
int rowBytes = bm.rowBytes();
int i,j;
/*remove alpha*/
for(i = 0; i < (imageSize/4);i++) {
rmAPixel[i] = SkUnPreMultiply::PMColorToColor(origPixel[i]);
}
/*write info*/
out.write((void *)format,sizeof(format));
out.write((void *)&fileSize,sizeof(int));
out.write((void *)&reserve,sizeof(int));
out.write((void *)&offByte,sizeof(int));
out.write((void *)&infoHeaderSize,sizeof(int));
out.write((void *)&width,sizeof(int));
out.write((void *)&height,sizeof(int));
out.write((void *)&planes,sizeof(short));
out.write((void *)&bpp,sizeof(short));
out.write((void *)&compression,sizeof(int));
out.write((void *)&imageSize,sizeof(int));
out.write((void *)&x,sizeof(int));
out.write((void *)&y,sizeof(int));
out.write((void *)&corlorUsed,sizeof(int));
out.write((void *)&corImportant,sizeof(int));
/*write data*/
for(i = 1; i <= height;i++) {
srcRow = rmAPixel + (imageSize / 4) - (i * rowBytes / 4);
//out.write((void *) srcRow,rowBytes);
#if 1
for(j = 1; j <= (rowBytes/4); j++) {
#if 0
a = ((*srcRow) & 0xff000000) >> 24;
r = ((*srcRow) & 0x00ff0000) >> 16;
g = ((*srcRow) & 0x0000ff00) >> 8;
b = ((*srcRow) & 0x000000ff) >> 0;
#endif
a = SkGetPackedA32(*srcRow);
r = SkGetPackedR32(*srcRow);
g = SkGetPackedG32(*srcRow);
b = SkGetPackedB32(*srcRow);
srcRow = srcRow + 1;
outPixel = (a << 24) | (b << 16 | (g << 8) | (r << 0));
out.write32(outPixel);
}
#endif
}
printf("Encode %s success!\n",fileName);
//out.close;
}
int main(int argc, char **argv) {
printf("The function is to encode a png to a bmp \n");
printf("please input the two files's path and file name\n");
printf("ex: decode_png_test /sdcard/DCIM/xx.png /sdcard/DCIM/xx.bmp\n");
if(argc < 3) {
printf("need 2 input parameter: file input and output dir\n");
return 0;
}
SkBitmap bm8888;
SkString filename(argv[1]);
char *endcodeFileName = argv[2];
SkFILEStream stream(filename.c_str());
SkImageDecoder* decoder = SkImageDecoder::Factory(&stream);
if (NULL == decoder) {
printf("couldn't decode %s \n", filename.c_str());
return 0;
}
bool success = decoder->decode(&stream, &bm8888, kN32_SkColorType,
SkImageDecoder::kDecodePixels_Mode);
if (success) {
printf("decode original png over!\n");
}
//stream.close();
encodeBMP2File(bm8888,endcodeFileName);
return 0;
}
Android.mk