android canvas c++ 繪圖

在android 下直接調用C++庫繪圖,直接看代碼

android 5.0中使用setInfo代替setConfig

int main(int argc, char** argv)
{
	int width = 720, height = 480;
    // set up the thread-pool
    sp<ProcessState> proc(ProcessState::self());
    ProcessState::self()->startThreadPool();

    // create a client to surfaceflinger
    sp<SurfaceComposerClient> client = new SurfaceComposerClient();
    //DisplayoutBuffer display;
    //client->getDisplayoutBuffer(client->getBuiltInDisplay(HWC_DISPLAY_PRIMARY), &display);
	sp<IBinder> dtoken(SurfaceComposerClient::getBuiltInDisplay(
            ISurfaceComposer::eDisplayIdMain));
	DisplayInfo dinfo;
	//獲取屏幕的寬高等信息
    status_t status = SurfaceComposerClient::getDisplayInfo(dtoken, &dinfo);
    width = dinfo.w;
    height = dinfo.h;
	printf("w=%d,h=%d,xdpi=%f,ydpi=%f,fps=%f,ds=%f\n",
        dinfo.w, dinfo.h, dinfo.xdpi, dinfo.ydpi, dinfo.fps, dinfo.density);
    if (status)
        return -1;
    sp<SurfaceControl> surfaceControl = client->createSurface(String8("testsurface"),
            dinfo.w, dinfo.h, PIXEL_FORMAT_RGB_565, 0);

/**
 * 
 * 繪製jpg圖片
 */
	SkFILEStream stream("/sdcard/test.jpg");
	SkImageDecoder* codec = SkImageDecoder::Factory(&stream);
	if (codec) {

		SkBitmap * bitmap = new SkBitmap();
		SkBitmap bmp;
		stream.rewind();
		codec->decode(&stream, &bmp, kRGB_565_SkColorType,
				SkImageDecoder::kDecodePixels_Mode);
		printf("image width=%d, high=%d\n", bmp.width(), bmp.height());
		surface->lock(&outBuffer, NULL);
		bpr = outBuffer.stride * bytesPerPixel(outBuffer.format);
		//bitmap.setConfig(convertPixelFormat(outBuffer.format), 320, 240, bpr);
		bitmap->setInfo(SkImageInfo::Make(width, height, kRGB_565_SkColorType, kUnpremul_SkAlphaType));
		bitmap->setPixels(outBuffer.bits);
		SkCanvas * canvas = new SkCanvas(*bitmap);
		//dev = new SkDevice(bitmap);
		//canvas.setDevice(dev);
		//canvas->drawBitmap(bmp, SkIntToScalar(0), SkIntToScalar(0));   //繪製原圖
		canvas->drawBitmapRect(bmp, SkRect::MakeWH(1080, 1940), &paint);   //縮放的方式繪製圖片

		//bitmap.

		printf("postScale after width=%d, height=%d", bmp.width(), bmp.height());

		surface->unlockAndPost();
		sleep(3);
		//delete dev;
	}
	delete bitmap;
	delete canvas;

	printf("exit!\n");

    IPCThreadState::self()->joinThreadPool();

    IPCThreadState::self()->stopProcess();

    return 0;
}

附一張圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章