将skia支持的其它格式图像转换为bmp8888的小工具

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值