首页 > 编程语言 > c/c++ > 简单验证码处理
2014
08-16

简单验证码处理

遇到一个奇葩的验证码:1,要求输入蓝色部分的字符,其干扰线和其他颜色的字符除了给人类造成识别干扰,不会对企图自动识别的程序造成任何困难,只需要抽取蓝色通道就可以还原比较干净的图片.
C#代码:

  using (Bitmap srcBmp = (Bitmap)System.Drawing.Bitmap.FromFile("1.png"))
            {
                int width = srcBmp.Width;
                int height = srcBmp.Height;
                for (int w = 0; w < width; w++)
                {
                    for (int h = 0; h < height; h++)
                    {
                        Color srcColor = srcBmp.GetPixel(w, h);
                        if (srcColor.R == 255 && srcColor.B == 255 && srcColor.G == 255)
                        {
                            Color d = Color.FromArgb(0xFFFFFF);
                            srcBmp.SetPixel(w, h, d);
                        }
                        else if (srcColor.B == 255)
                        {
                            srcBmp.SetPixel(w, h, srcColor);
                        }
                        else
                        {
                            Color d = Color.FromArgb(0xFFFFFF);
                            srcBmp.SetPixel(w, h, d);
                        }

                    }
                }
                srcBmp.Save("2.png");
                srcBmp.Dispose();
            }

C++代码:

#include <iostream>
#include <gdiplus.h>
#include <windows.h>
#include <string.h>

using namespace Gdiplus;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes

    ImageCodecInfo* pImageCodecInfo = NULL;

    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1;  // Failure

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1;  // Failure

    GetImageEncoders(num, size, pImageCodecInfo);

    for(UINT j = 0; j < num; ++j)
    {
        if( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }

    free(pImageCodecInfo);
    return -1;  // Failure
}

inline wchar_t* CharToWchar(const char* c)
{
    int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);
    wchar_t* m_wchar=new wchar_t[len+1];
    MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);
    m_wchar[len]='\0';
    return m_wchar;
}

void splitBlue(const char* infile,const char* outfile)
{
    GdiplusStartupInput m_gdiplusStartupInput;
    ULONG_PTR m_pGdiToken;
    GdiplusStartup( &m_pGdiToken , &m_gdiplusStartupInput , NULL );
    wchar_t *lpszFile;
    lpszFile = CharToWchar(infile);
    Bitmap *bmp = new Bitmap(lpszFile);
    int w = bmp->GetWidth();
    int h = bmp->GetHeight();
    Color posColor,whiteColor;
    whiteColor.SetFromCOLORREF(RGB(0, 255, 255));
    for(int i=0;i<w;i++)
    {
        for(int j=0;j<h;j++)
        {
            bmp->GetPixel(i,j,&posColor);
            if(posColor.GetR() == 255 && posColor.GetB()==255  && posColor.GetG()==255)
            {
                bmp->SetPixel(i,j,whiteColor);
            }
            else if(posColor.GetB()!=255)
            {
                bmp->SetPixel(i,j,whiteColor);
            }
        }
    }

    CLSID imgClsid;
    GetEncoderClsid(L"image/jpeg",&imgClsid);

    wchar_t* out;
    out = CharToWchar(outfile);
    bmp->Save(out,&imgClsid,NULL);
    delete bmp;
    GdiplusShutdown(m_pGdiToken);
}

int main()
{
    splitBlue("1.png","3.png");
    return 0;
}

还原后的图片:2

最后编辑:
作者:NINE
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。