频道栏目
首页 > 资讯 > 其他综合 > 正文

加载DLL中的图片资源生成Skia中的SkBitmap对象

16-01-20        来源:[db:作者]  
收藏   我要投稿

PPAPI Plugin在Windows下是DLL,可以嵌入图片文件,使用Skia绘图时需要根据DLL里的图片文件生成SkBitmap对象。下面是代码:

#include "utils.h"
#include "SkStream.h"
#include "SkImageDecoder.h"
#include 

SkBitmap* loadImageFromResource(UINT resId, LPCTSTR lpType)
{
    TCHAR szLog[512] = { 0 };
    HMODULE hModule = NULL;
    if (FALSE == GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS
        , (LPCTSTR)loadImageFromResource, &hModule))
    {
        _stprintf_s(szLog, 512, _T("GetModuleHandleEx failed, error - %d\r\n"), GetLastError());
        OutputDebugString(szLog);
        return NULL;
    }

    HRSRC hRsrc = FindResource(hModule, MAKEINTRESOURCE(resId), lpType);
    if (hRsrc == NULL)
    {
        _stprintf_s(szLog, 512, _T("FindResource failed, error - %d\r\n"), GetLastError());
        OutputDebugString(szLog);
        return NULL;
    }

    HGLOBAL hImgData = LoadResource(hModule, hRsrc);
    if (hImgData == NULL)
    {
        _stprintf_s(szLog, 512, _T("LoadResource failed, error - %d\r\n"), GetLastError());
        OutputDebugString(szLog);
        return NULL;
    }

    LPVOID lpData = LockResource(hImgData);
    if (lpData == NULL)
    {
        _stprintf_s(szLog, 512, _T("LockResource failed, error - %d\r\n"), GetLastError());
        OutputDebugString(szLog);
        return NULL;
    }

    DWORD dwSize = SizeofResource(hModule, hRsrc);

    SkMemoryStream memoryStream(lpData, dwSize);
    SkImageDecoder *decoder = SkImageDecoder::Factory(&memoryStream);
    if (!decoder)
    {
        OutputDebugString(_T("SkImageDecoder::Factory failed\r\n"));
        FreeResource(hImgData);
        return NULL;
    }

    SkBitmap *bitmap = new SkBitmap();
    if (SkImageDecoder::kSuccess == decoder->decode(&memoryStream,
        bitmap, kBGRA_8888_SkColorType,
        SkImageDecoder::kDecodePixels_Mode))
    {
        FreeResource(hImgData);
        return bitmap;
    }

    //error
    OutputDebugString(_T("SkImageDecoder::decode failed\r\n"));
    FreeResource(hImgData);
    delete bitmap;
    return NULL;
}

使用非常简单:

SkBitmap *bitmap = loadImageFromResource(IDB_CLEAR, _T("PNG"));

注意我添加的是png文件,rc文件内有类似这样的语句:

IDB_CLEAR    PNG    "images\\icon-clear.png"

其中第二列是资源类型,调用loadImageFromResource时指定的类型与这里一致即可。

相关TAG标签
上一篇:JavaSE入门学习3:搭建Java开发环境(一)
下一篇:认识 sun.misc.Unsafe
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站