在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;
}
附一张图