C++ jpg内存中绘制图片,字体并以char*的形式输出_c++生成文字内存图片-程序员宅基地

技术标签: C++、Qt  Gdi jpg 绘图  

1.Gdi的调用

链接附加依赖项:gdiplus.lib

#include <comdef.h>//(不加这个可能会报错)
#include <GdiPlus.h>

//开始调用

ULONG_PTR                        g_pGdiToken = NULL;
Gdiplus::GdiplusStartupInput    g_gdiplusStartupInput;

Gdiplus::GdiplusStartup(&g_pGdiToken, &g_gdiplusStartupInput, NULL);

//结束调用

Gdiplus::GdiplusShutdown(g_pGdiToken);

2.Jpg转Gdi bitmap

在开始之前事先申请内存(临时new的时候不行,不知道为啥)

m_hImageMemPic = GlobalAlloc(GMEM_FIXED, MAXPICBUF);

// Jpg转换为Image;
bool JPG2Image(void *szBuf, DWORD dwBufSize)
{
    HGLOBAL hMem = m_hImageMemPic;
    Gdiplus::Image** ppImage = &m_pImagePic;
    
    m_sizePicOut.cx = 0;
    m_sizePicOut.cy = 0;

    int nMaxLen = MAXPICBUF;
    BOOL bAlloc = FALSE;
    if (hMem == NULL)
    {
        bAlloc = TRUE;
        hMem = GlobalAlloc(GMEM_FIXED, nMaxLen);
    }

    if (*ppImage != NULL)
    {
        delete *ppImage;
        *ppImage = NULL;
    }

    if (dwBufSize != 0)
    {
        IStream* pStmBmp = NULL;
        CreateStreamOnHGlobal(hMem, FALSE, &pStmBmp);
        BYTE* pbyBmp = (BYTE *)GlobalLock(hMem);
        memset(pbyBmp, 0, nMaxLen);
        memcpy(pbyBmp, szBuf, dwBufSize);
        ::GlobalUnlock(hMem);
        *ppImage = Gdiplus::Image::FromStream(pStmBmp, FALSE);
        if ((*ppImage) != NULL)
        {
            m_sizePicOut.cx = (*ppImage)->GetWidth();
            m_sizePicOut.cy = (*ppImage)->GetHeight();
        }
    }

    if (bAlloc)
    {
        GlobalFree(hMem);
    }

    return ((*ppImage) != NULL);

    /*CLSID pngClsid;
    GetEncoderClsid(L"image/bmp", &pngClsid);
    m_pImagePic->Save(L"Mosaic245.bmp", &pngClsid, NULL);*/
}

3.Gdi绘制图片

   HDC hdc = GetDC(NULL);
    HDC hTempMemDC = ::CreateCompatibleDC(NULL);
    HBITMAP bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_sizePicOut.cx, m_sizePicOut.cy);//hdc
    if (bmpTmpDraw == NULL) bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_sizePicOut.cx, m_sizePicOut.cy);
    if (bmpTmpDraw == NULL)
    {
        return;
    }
    HGDIOBJ oldObj = ::SelectObject(hTempMemDC, bmpTmpDraw);
    RECT rc;
    rc.left = 0;
    rc.top = 0;
    rc.right = m_sizePicOut.cx;
    rc.bottom = m_sizePicOut.cy;

 if (pImage)
    {
        Gdiplus::Graphics g(hdc);
        Gdiplus::ImageAttributes ImgAtt;
        ImgAtt.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
        g.DrawImage(pImage, Gdiplus::Rect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top),
            0, 0, pImage->GetWidth(), pImage->GetHeight(),
            Gdiplus::UnitPixel, &ImgAtt, NULL, NULL);
    }

4.  绘制字体

 LOGFONTW lfont;
    memset(&lfont, 0, sizeof(lfont));
    int emSize = 70;
    lfont.lfHeight = -emSize; //   nHeight   注意使用负值,表示character height,  正值表示 cell height
    lfont.lfWeight = 400;//100;//FW_NORMAL,  //nWeight
    lfont.lfCharSet = GB2312_CHARSET;//;//ANSI_CHARSET
    wcscpy(lfont.lfFaceName, (L"微软雅黑"));  //   lpszFacename
    Gdiplus::Font gdifont(hdc, &lfont);
    
    Gdiplus::StringFormat strformat;
    strformat.SetAlignment(Gdiplus::StringAlignmentNear);//水平居左  
    strformat.SetLineAlignment(Gdiplus::StringAlignmentCenter);//垂直居中 
    Gdiplus::Font gFont(hdc, &lfont);
    Gdiplus::Color clr1(255, 255, 255);
    Gdiplus::SolidBrush    br1(clr1);
    Gdiplus::Graphics gdiGraphics(hdc);
    wchar_t tempText[256] = { 0 };
    int nLen = 0;
    for (int i = 0; i < HVCR_CUSTOM_OSD_NUM; i++)
    {
        nLen = strlen(m_osdcfg.StOSDItems[i].szOSD_CHAR);
        if (nLen == 0)
        {
            continue;
        }
        Gdiplus::RectF rec(50, 50 + 100 * i, 2000, 100);
        memset(tempText, 0, 256);
        char2wchar(tempText, m_osdcfg.StOSDItems[i].szOSD_CHAR);
        gdiGraphics.DrawString(tempText, -1, &gdifont, rec, &strformat, &br1);
    }

5.Image转Byte*

char* AddOSdInfo::Image2Byte(HGLOBAL mem, HBITMAP bmpTmpDraw)
{
    Gdiplus::Bitmap bm2((HBITMAP)bmpTmpDraw, NULL);
    CLSID Clsid2;
    GetEncoderClsid(L"image/jpeg", &Clsid2);//GetEncoderClsid函数在文末
    //bm2.Save(sNewPath2, &Clsid2);

    IStream *stream = NULL;
    HRESULT hr2 = CreateStreamOnHGlobal(mem, TRUE, &stream);
    bm2.Save(stream, &Clsid2);
    LARGE_INTEGER seekPos = {0};
    ULARGE_INTEGER imageSize;
    HRESULT hr = stream->Seek(seekPos, STREAM_SEEK_CUR, &imageSize);
    if (m_pBody)
    {
        delete m_pBody;
        m_pBody = NULL;
    }
    m_pBody = new BYTE[imageSize.LowPart];
    hr = stream->Seek(seekPos, STREAM_SEEK_SET, 0);
    hr = stream->Read(m_pBody, imageSize.LowPart, 0);
    m_nFileSize = imageSize.LowPart;
    
    //KOSA_fileWriteFile("SSSA.jpg", (UINT8*)m_pBody, imageSize.LowPart, false);
    return (char*)m_pBody;
}

6.封装的类

//头文件

#ifndef ADDOSDINFO_H
#define ADDOSDINFO_H
#include "kosa_file.h"
#include "kosa_dir.h"
#include <comdef.h>
#include <GdiPlus.h>
#include "Define.h"
#define MAXPICBUF                    6144000            // 最大图片缓冲区大小
class AddOSdInfo
{
public:
    
    ~AddOSdInfo();

    static AddOSdInfo* GetInstance();

    void SetOriginPicInfo(void *szBuf, DWORD dwBufSize, HVCR_OSD_CFG* osdcfg = NULL);

    bool JPG2Image(void *szBuf, DWORD dwBufSize);
    /*
    GetOsdPicInfo 返回图片的buffer, nFileLen图片长度
    */
    void* GetOsdPicInfo(Uint32* nFileLen);

    char* Image2Byte(HGLOBAL mem, HBITMAP bmpTmpDraw);

    void DrawImageEx(HDC hdc, Gdiplus::Image* pImage, RECT rc);

    void DrawInfo(HDC hdc, void *oldObj, HBITMAP bmpTmpDraw, HDC  hTempMemDC);

    Uint32 GetFileLen();

    void*  GetBuffer();

    void  SetOsdInfo(HVCR_OSD_CFG *osdcfg);
private:
    static AddOSdInfo* m_instance;
    
    AddOSdInfo();

    HGLOBAL        m_hImageMemPic;

    Gdiplus::Image* m_pImagePic;
    SIZE    m_sizePicOut;
    Uint32    m_nFileSize;
    void *    m_pBody;
    HVCR_OSD_CFG m_osdcfg;
    
};

#endif
 

//CPP文件

#include "AddOSdInfo.h"
#include "kosa_file.h"
#include "kosa_dir.h"
AddOSdInfo* AddOSdInfo::m_instance = NULL;
ULONG_PTR                        g_pGdiToken = NULL;
Gdiplus::GdiplusStartupInput    g_gdiplusStartupInput;

int GetEncoderClsid(const WCHAR * format, CLSID * pClsid)
{
    int nRet = -1;
    Gdiplus::ImageCodecInfo * pCodecInfo = NULL;
    UINT nNum = 0, nSize = 0;
    Gdiplus::GetImageEncodersSize(&nNum, &nSize);

    if (nSize < 0)
    {
        return nRet;
    }

    pCodecInfo = new Gdiplus::ImageCodecInfo[nSize];

    if (pCodecInfo == NULL)
    {
        return nRet;
    }

    Gdiplus::GetImageEncoders(nNum, nSize, pCodecInfo);

    for (UINT i = 0; i < nNum; i++)
    {
        if (wcscmp(pCodecInfo[i].MimeType, format) == 0)
        {
            *pClsid = pCodecInfo[i].Clsid;
            nRet = i;
            delete[] pCodecInfo;
            return nRet;
        }
        else
        {
            continue;
        }
    }

    delete[] pCodecInfo;
    return nRet;
}

bool char2wchar(wchar_t* pwsz, const char* psz)
{
    int len = MultiByteToWideChar(CP_ACP, 0, psz, -1, NULL, 0);
    if (!pwsz)
    {
        return false;
    }
    memset(pwsz, 0, len + 1);
    MultiByteToWideChar(CP_ACP, 0, psz, -1, pwsz, len);

    return true;
}


AddOSdInfo::AddOSdInfo()
{
    m_pImagePic = NULL;
    Gdiplus::GdiplusStartup(&g_pGdiToken, &g_gdiplusStartupInput, NULL);
    m_hImageMemPic = GlobalAlloc(GMEM_FIXED, MAXPICBUF);
    m_pBody = NULL;
    memset(&m_osdcfg, 0, sizeof(m_osdcfg));
}

AddOSdInfo *AddOSdInfo::GetInstance()
{
    if (m_instance == NULL)
    {
        m_instance = new AddOSdInfo;
        
    }
    return m_instance;
}


AddOSdInfo::~AddOSdInfo()
{
    if (m_hImageMemPic != NULL)
    {
        GlobalFree(m_hImageMemPic); 
        m_hImageMemPic = NULL; 
    }

    if (g_pGdiToken)
    {
        Gdiplus::GdiplusShutdown(g_pGdiToken);
        g_pGdiToken = 0;
    }

}

void* AddOSdInfo::GetOsdPicInfo(Uint32 *pSize)
{    
    *pSize = m_nFileSize;
    return m_pBody;
}

void AddOSdInfo::SetOriginPicInfo(void *szBuf, DWORD dwBufSize, HVCR_OSD_CFG* osdcfg)
{
    if (osdcfg)
    {
        memcpy(&m_osdcfg, osdcfg, sizeof(HVCR_OSD_CFG));
    }
    JPG2Image(szBuf, dwBufSize);

    HDC hdc = GetDC(NULL);
    HDC hTempMemDC = ::CreateCompatibleDC(NULL);
    HBITMAP bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_sizePicOut.cx, m_sizePicOut.cy);//hdc
    if (bmpTmpDraw == NULL) bmpTmpDraw = ::CreateCompatibleBitmap(hdc, m_sizePicOut.cx, m_sizePicOut.cy);
    if (bmpTmpDraw == NULL)
    {
        return;
    }
    HGDIOBJ oldObj = ::SelectObject(hTempMemDC, bmpTmpDraw);
    RECT rc;
    rc.left = 0;
    rc.top = 0;
    rc.right = m_sizePicOut.cx;
    rc.bottom = m_sizePicOut.cy;
    DrawImageEx(hTempMemDC, m_pImagePic, rc);

    DrawInfo(hTempMemDC, oldObj, bmpTmpDraw, hTempMemDC);

    Image2Byte(m_hImageMemPic, bmpTmpDraw);

    if (bmpTmpDraw != NULL)
    {
        DeleteObject(bmpTmpDraw);
        bmpTmpDraw = NULL;
    }
    if (hTempMemDC != NULL)
    {
        DeleteObject(hTempMemDC);
        hTempMemDC = NULL;
    }
}


// Jpg转换为Image;
bool AddOSdInfo::JPG2Image(void *szBuf, DWORD dwBufSize)
{
    HGLOBAL hMem = m_hImageMemPic;
    Gdiplus::Image** ppImage = &m_pImagePic;
    
    m_sizePicOut.cx = 0;
    m_sizePicOut.cy = 0;

    int nMaxLen = MAXPICBUF;
    BOOL bAlloc = FALSE;
    if (hMem == NULL)
    {
        bAlloc = TRUE;
        hMem = GlobalAlloc(GMEM_FIXED, nMaxLen);
    }

    if (*ppImage != NULL)
    {
        delete *ppImage;
        *ppImage = NULL;
    }

    if (dwBufSize != 0)
    {
        IStream* pStmBmp = NULL;
        CreateStreamOnHGlobal(hMem, FALSE, &pStmBmp);
        BYTE* pbyBmp = (BYTE *)GlobalLock(hMem);
        memset(pbyBmp, 0, nMaxLen);
        memcpy(pbyBmp, szBuf, dwBufSize);
        ::GlobalUnlock(hMem);
        *ppImage = Gdiplus::Image::FromStream(pStmBmp, FALSE);
        if ((*ppImage) != NULL)
        {
            m_sizePicOut.cx = (*ppImage)->GetWidth();
            m_sizePicOut.cy = (*ppImage)->GetHeight();
        }
    }

    if (bAlloc)
    {
        GlobalFree(hMem);
    }

    /*CLSID pngClsid;
    GetEncoderClsid(L"image/jpeg", &pngClsid);
    m_pImagePic->Save(L"Mosaic245.jpg", &pngClsid, NULL);*/

    return ((*ppImage) != NULL);
}


void*  AddOSdInfo::GetBuffer()
{
    return m_pBody;
}

Uint32 AddOSdInfo::GetFileLen()
{
    return m_nFileSize;
}

void  AddOSdInfo::SetOsdInfo(HVCR_OSD_CFG *osdcfg)
{
    memcpy(&m_osdcfg, osdcfg, sizeof(HVCR_OSD_CFG));
}

void AddOSdInfo::DrawInfo(HDC hdc, void *oldObj, HBITMAP bmpTmpDraw, HDC hTempMemDC)
{
#if 0
    HFONT hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);//CDC::GetCurrentFont(hdc);
    LOGFONT LogFont = { 0 };
    ::GetObject(hFont, sizeof(LOGFONT), &LogFont);
    ::DeleteObject(hFont);

    LogFont.lfHeight = -80; // 字体大小 
    hFont = CreateFontIndirect(&LogFont);
    HFONT hOldFont = (HFONT)::SelectObject(hdc, hFont);
    COLORREF clr = 0xFFFFFF;
    COLORREF clrOld = ::GetTextColor(hdc);
    SetBkMode(hdc, TRANSPARENT);
    ::SetTextColor(hdc, clr);
    
    int nLen = 0;
    for (int i = 0; i < HVCR_CUSTOM_OSD_NUM; i++)
    {
        nLen = strlen(m_osdcfg.StOSDItems[i].szOSD_CHAR);
        if (nLen == 0)
        {
            continue;
        }

        ::TextOut(hdc, 80, 100 * (i + 1), m_osdcfg.StOSDItems[i].szOSD_CHAR, nLen);
    }
    ::SetTextColor(hdc, clrOld);
    //char szTxt[168] = { 0 };
    //sprintf(szTxt, "ddddd大家好的萨芬硒鼓硒鼓", strlen("ddddd大家好的萨芬硒鼓硒鼓"));
    //::TextOut(hdc, 100, 100, szTxt, strlen(szTxt));
    //
#else
    
    //create font
    LOGFONTW lfont;
    memset(&lfont, 0, sizeof(lfont));
    int emSize = 70;
    lfont.lfHeight = -emSize; //   nHeight   注意使用负值,表示character height,  正值表示 cell height
    lfont.lfWeight = 400;//100;//FW_NORMAL,  //nWeight
    lfont.lfCharSet = GB2312_CHARSET;//;//ANSI_CHARSET
    wcscpy(lfont.lfFaceName, (L"微软雅黑"));  //   lpszFacename

    Gdiplus::Font gdifont(hdc, &lfont);
    
    Gdiplus::StringFormat strformat;
    strformat.SetAlignment(Gdiplus::StringAlignmentNear);//水平居左  
    strformat.SetLineAlignment(Gdiplus::StringAlignmentCenter);//垂直居中 
    Gdiplus::Font gFont(hdc, &lfont);
    Gdiplus::Color clr1(255, 255, 255);
    Gdiplus::SolidBrush    br1(clr1);
    Gdiplus::Graphics gdiGraphics(hdc);
    wchar_t tempText[256] = { 0 };
    int nLen = 0;
    for (int i = 0; i < HVCR_CUSTOM_OSD_NUM; i++)
    {
        nLen = strlen(m_osdcfg.StOSDItems[i].szOSD_CHAR);
        if (nLen == 0)
        {
            continue;
        }
        Gdiplus::RectF rec(50, 50 + 100 * i, 2000, 100);
        memset(tempText, 0, 256);
        char2wchar(tempText, m_osdcfg.StOSDItems[i].szOSD_CHAR);
        gdiGraphics.DrawString(tempText, -1, &gdifont, rec, &strformat, &br1);
    }
#endif
    /*
    wchar_t *sNewPath2 = L"..\\DevInterfaces\\HVCR_KD_V7_1\\tempDir\\temp.jpg";
    Gdiplus::Bitmap bm2((HBITMAP)bmpTmpDraw, NULL);
    CLSID Clsid2;
    GetEncoderClsid(L"image/jpeg", &Clsid2);//GetEncoderClsid函数在文末
    //bm2.Save(sNewPath2, &Clsid2);

    IStream *stream = NULL;
    HRESULT hr2 = CreateStreamOnHGlobal(m_hImageMemPic, TRUE, &stream);
    bm2.Save(stream, &Clsid2);
    LARGE_INTEGER seekPos = {0};
    ULARGE_INTEGER imageSize;
    HRESULT hr = stream->Seek(seekPos, STREAM_SEEK_CUR, &imageSize);
    if (m_pBody)
    {
        delete m_pBody;
        m_pBody = NULL;
    }
    m_pBody = new BYTE[imageSize.LowPart];
    hr = stream->Seek(seekPos, STREAM_SEEK_SET, 0);
    hr = stream->Read(m_pBody, imageSize.LowPart, 0);
    m_nFileSize = imageSize.LowPart;
    KOSA_fileWriteFile("SSSA.jpg", (UINT8*)m_pBody, imageSize.LowPart, false);
    */
    SelectObject(hTempMemDC, oldObj);
}

char* AddOSdInfo::Image2Byte(HGLOBAL mem, HBITMAP bmpTmpDraw)
{
    Gdiplus::Bitmap bm2((HBITMAP)bmpTmpDraw, NULL);
    CLSID Clsid2;
    GetEncoderClsid(L"image/jpeg", &Clsid2);//GetEncoderClsid函数在文末
    //bm2.Save(sNewPath2, &Clsid2);

    IStream *stream = NULL;
    HRESULT hr2 = CreateStreamOnHGlobal(mem, TRUE, &stream);
    bm2.Save(stream, &Clsid2);
    LARGE_INTEGER seekPos = {0};
    ULARGE_INTEGER imageSize;
    HRESULT hr = stream->Seek(seekPos, STREAM_SEEK_CUR, &imageSize);
    if (m_pBody)
    {
        delete m_pBody;
        m_pBody = NULL;
    }
    m_pBody = new BYTE[imageSize.LowPart];
    hr = stream->Seek(seekPos, STREAM_SEEK_SET, 0);
    hr = stream->Read(m_pBody, imageSize.LowPart, 0);
    m_nFileSize = imageSize.LowPart;
    
    //KOSA_fileWriteFile("SSSA.jpg", (UINT8*)m_pBody, imageSize.LowPart, false);
    return (char*)m_pBody;
}


void AddOSdInfo::DrawImageEx(HDC hdc, Gdiplus::Image* pImage, RECT rc)
{
    if (pImage)
    {
        Gdiplus::Graphics g(hdc);
        Gdiplus::ImageAttributes ImgAtt;
        ImgAtt.SetWrapMode(Gdiplus::WrapModeTileFlipXY);
        g.DrawImage(pImage, Gdiplus::Rect(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top),
            0, 0, pImage->GetWidth(), pImage->GetHeight(),
            Gdiplus::UnitPixel, &ImgAtt, NULL, NULL);
    }
    else
    {
        //绘制背景
        HBRUSH hbrush = CreateSolidBrush(GetBkColor(hdc));
        ::FillRect(hdc, &rc, hbrush);
        ::DeleteObject(hbrush);
    }
}
 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_16628589/article/details/103028739

智能推荐

Android studio如何导入Eclispe项目以及Eclispe如何导入Android项目_eclispe和android studio文件之间怎么转化-程序员宅基地

文章浏览阅读2.1k次。Android studio如何导入Eclispe项目直接导入,选择 Import project (Eclipse ADT, Gradle, etc.) 一路next就可以了。Eclispe如何导入Android studio项目不能直接导入,手工改。(以下Android studio简称 as)在eclipse 上新建一个空的项目;点击 android studio 中的android 视_eclispe和android studio文件之间怎么转化

android 设置TextView水平滚动和解决首行缩进问题_手机浏览器内文章段落首行不缩进-程序员宅基地

文章浏览阅读68次。android 设置TextView水平滚动和解决首行缩进问题_手机浏览器内文章段落首行不缩进

MySQL基础之表的管理-程序员宅基地

文章浏览阅读119次。添加和删除字段操作添加字段alter table tbl_name add 字段名称 字段属性 [完整性约束条件] [first|after 字段名称之后];删除字段alter table tbl_name drop 字段名称;测试create table if not exists user1( id int unsigned auto_increment key);--..._mysql基础之表的管理

栅格数据赋值编程C语言,使用Rasterio读取栅格数据的实例讲解-程序员宅基地

文章浏览阅读458次。Rasterio简介有没有觉得用GDAL的Python绑定书写的代码很不Pythonic,强迫症的你可能有些忍受不了。不过,没关系,MapBox旗下的开源库Rasterio帮我们解决了这个痛点。Rasterio是基于GDAL库二次封装的更加符合Python风格的主要用于空间栅格数据处理的Python库。Rasterio中栅格数据模型基本和GDAL类似,需要注意的是:在Rasterio 1.0以后,..._c语言栅格数据读取与基本操作

如何用python画一条蟒蛇_Python之绘制蟒蛇-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏6次。1、turtle库是python常用的绘制图像的库,根据一组函数的指令决定轨迹图形。2、def用于定义函数,def所定义的函数在程序中未经调用不能直接执行,需要通过函数名调用才能执行。3、turtle.setup(宽度,高度,左上角横坐标,左上角纵坐标)——这个函数用于创建一个图形窗口。4、turtle.pensize(size)——表示运行轨迹的宽度,size单位为像素。5、turtle.pen..._python蟒蛇绘制中rad,angle,len,neckrad

XML解析_<?xml version="1.1"?>-程序员宅基地

文章浏览阅读456次。1. XML总结1.1. XML简介XML : 可扩展的标记语言。(和HTML非常类似的) - 可扩展的。 - 自定义的标签。与HTML区别: XML传输数据,HTML是显示数据。XML的版本: XML1.0(几乎都使用该版本) XML1.1(不向下兼容)做什么用?=>描述有关系的数据应用 1. 作为配置文件。 2. 可以在系统与系统之间进行数据的传输。 * webserivice_

随便推点

C语言中字符串用strcmp和==比较的问题_字符串可以用==比较吗-程序员宅基地

文章浏览阅读6.1k次,点赞8次,收藏47次。文章目录导论正文strcmp()函数实例1.字符串比较2.字符串变量比较3.字符串数组比较结论导论在判断两个字符串的内容是否相等的时候,如果使用==,当两个字符串不是指向内存中同一地址时,那么即使这两个字符串内容一样,但是用==比较出来的结果也是 false。所以两个字符串在比较内容是否相等的时候一定要使用strcmp()。正文strcmp()函数为了便于大家的阅读和理解,在这里先简单的介绍下strcmp()函数使用格式:#include<string.h>int strcmp_字符串可以用==比较吗

R语言文本特征工程:词袋模型-程序员宅基地

文章浏览阅读1.4k次。作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。邮箱:huang.tian-yuan..._词袋法 文本相似度 r语言

android后台进程常驻,android 后台常驻,不会被kill-程序员宅基地

文章浏览阅读2.5k次。第一步:import android.app.Notification;import android.app.PendingIntent;import android.app.Service;import android.content.Context;import android.content.Intent;import android.media.MediaPlayer;import and..._安卓应用常驻通知 后是不是不会被杀死

贝叶斯线性回归文章汇总_贝叶斯回归分析和偏最小二乘回归分析-程序员宅基地

文章浏览阅读2.3k次。一、常规线性回归及其求解方法核心提炼1、普通最小二乘法(OLS)的解析解可以用 Gaussian 分布以及极大似然估计解释;2、Ridge 回归可以用 Gaussian 分布和最大后验估计解释 ;3、LASSO 回归可以用 Laplace 分布和最大后验估计解释。二、贝叶斯线性回归定义贝叶斯线性回归(Bayesian linear r..._贝叶斯回归分析和偏最小二乘回归分析

C数据结构:树和森林存储方式与遍历方式_c语言输入并存储一个森林-程序员宅基地

文章浏览阅读1.4k次,点赞5次,收藏15次。树的定义:只有一个根节点,但是分支可以没有规律,也就是说不像二叉树那样每个结点最多生出两个分支。而且树和接下去学习的图都有一个共同的特点就是套娃,无限套娃。树的存储结构方式都会用到数组顺序存储结构,数组是核心,数组结合链式的也有。至于为什么树要用到数组比较多,我认为是数组有一个很好的点就是他的位置可以很容易且快速的找到并访问,但是链式就不具有该优点,因为链式是一条绳子上的蚂蚱,必须一个一个的找。很显然就像名字说的那样,用该结点的双亲结点位置来表示当前的结点。双亲表示法就比如:让孩子记住自己父母的电话一_c语言输入并存储一个森林

位运算符——&0xFF的运算与讲解_代码对&0xff-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏51次。区分 &,丨,^的运算规则 & (按位与运算符)表示:两个操作数中位都为1,结果为1如果两个操作中位一个1另一个0 ,结果为0即运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;例如:1010 & 1110= 1010|(按位或运算符)表示:两个操作中位只有一个为1,结果就等与1即运算规则:0|0=0; ..._代码对&0xff

推荐文章

热门文章

相关标签