大牛帮忙看看我这个误差扩散算法错哪里了?

shiter
人工智能领域优质创作者
博客专家认证
2016-02-01 01:01:35
加精


这个算法就是让,二值图像近似的表示灰度图像

代码:还有openmp版本的,也不知道错哪里了,求指点



// ERROR-diffusion.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "omp.h"
#include "windows.h"
#include <iostream>

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


#pragma comment(lib,"opencv_core2410d.lib")
#pragma comment(lib,"opencv_highgui2410d.lib")
#pragma comment(lib,"opencv_imgproc2410d.lib")

using namespace std;
using namespace cv;

void error_diffusion(unsigned int width,
unsigned int height,
unsigned short **InputImage,
unsigned short **OutputImage
)

{

for (unsigned int i = 0;i < height-1; i++)
{
for(unsigned int j = 0;j < width; j++)
{
//计算输出像素的值
if (InputImage[i][j]<128)
{
OutputImage[i][j] = 0;
}
else{ OutputImage[i][j] = 1;}

//计算误差值
int err = InputImage[i][j] - 255*OutputImage[i][j];
//扩散误差
InputImage[i][j+1] += err * 7/16;
InputImage[i+1][j-1] += err * 7/16;
InputImage[i+1][j] += err * 7/16;
InputImage[i+1][j+1] += err * 7/16;
}
}
}

int row = 288;
//int col = width;

void error_diffusion_omp(unsigned int width,
unsigned int height,
unsigned short **InputImage,
unsigned short **OutputImage
)

{
int cpu_num = omp_get_num_procs();//cpu数

int col = width;
#pragma omp parallel private(row , col)//并行域
{
int thread_id = omp_get_num_threads();//每个线程的线程号
Sleep(20*thread_id);//根据线程短延迟

#pragma omp for
for (int i = 0; i<(height/cpu_num);i++)
{
row = row*cpu_num + thread_id;

for ( col = 0;col<width;col++)
{
//计算输出像素的值
if (InputImage[i][col]<128)
{
OutputImage[i][col] = 0;
}
else{ OutputImage[i][col] = 1;}

//计算误差值
int err = InputImage[i][col] - 255*OutputImage[i][col];
//扩散误差
InputImage[i][col+1] += err * 7/16;
InputImage[i+1][col-1] += err * 7/16;
InputImage[i+1][col] += err * 7/16;
InputImage[i+1][col+1] += err * 7/16;
}
}



}
}



int _tmain(int argc, _TCHAR* argv[])
{
string str_name = "result.pgm";


Mat image_src = imread(str_name,1);
imshow("original image",image_src);

unsigned short **InputImage = new unsigned short *[image_src.rows];
for (int i = 0;i<image_src.rows;i++)
{
InputImage[i] = new unsigned short [image_src.cols];
}
unsigned short **OutputImage = new unsigned short *[image_src.rows];
for (int i = 0;i<image_src.rows;i++)
{
OutputImage[i] = new unsigned short [image_src.cols];
}

cout<<image_src.rows;
cout<<image_src.cols;
Mat image_dst(image_src.rows,image_src.cols,CV_8U);

for(int y = 0;y < image_src.rows;y++)
{
uchar *ptr= image_src.ptr<uchar>(y);

for(int x = 0;x < image_src.cols;x++)
{

InputImage[y][x] = ptr[x];
OutputImage[y][x] = 0;

}
}


error_diffusion(image_src.cols,image_src.rows,InputImage,OutputImage);
//error_diffusion_omp(image_src.cols,image_src.rows,InputImage,OutputImage);

for(int y = 0;y < image_src.rows;y++)
{
uchar *ptr= image_dst.ptr<uchar>(y);

for(int x = 0;x < image_src.cols;x++)
{
if (OutputImage[y][x]==1)
{
ptr[x] = 255;
}


}
}
imshow("error diffusion",image_dst);

waitKey(0);


return 0;
}



...全文
2677 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
lgx062800 2016-02-19
  • 打赏
  • 举报
回复
引用 4 楼 mewiteor 的回复:
整数运算改成浮点数试试
???
CoadingTime 2016-02-17
  • 打赏
  • 举报
回复
brk1985 2016-02-16
  • 打赏
  • 举报
回复
帮顶一下
一叶知秋V 2016-02-15
  • 打赏
  • 举报
回复
wsyouhou 2016-02-14
  • 打赏
  • 举报
回复
好像很复杂的感觉
lm_whales 2016-02-04
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
#pragma comment(lib, "gdiplus.lib")
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#include <gdiplus.h>
#include <assert.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
}
void error_diffusion(unsigned int width,
                     unsigned int height,
                     unsigned short **InputImage,
                     unsigned short **OutputImage
    )
{
    for (unsigned int i = 0;i < height-1; i++)
    {
        for(unsigned int j = 1;j < width-1; j++)
        {
            //计算输出像素的值
            if (InputImage[i][j]<128)
            {
                OutputImage[i][j] = 0;
            }
            else{ OutputImage[i][j] = 1;}
            //计算误差值
            int err = (int)InputImage[i][j] - 255*OutputImage[i][j];
            //扩散误差
            int v;
            v=(int)InputImage[i  ][j+1];v+=err*7/16;if (v>255) v=255; if (v<0) v=0;InputImage[i  ][j+1]=(unsigned short)v;
            v=(int)InputImage[i+1][j-1];v+=err*3/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j-1]=(unsigned short)v;
            v=(int)InputImage[i+1][j  ];v+=err*5/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j  ]=(unsigned short)v;
            v=(int)InputImage[i+1][j+1];v+=err*1/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j+1]=(unsigned short)v;
        }
    }
}
int main()
{
    unsigned int j,y,x;

    GdiplusStartupInput gdiplusstartupinput;
    ULONG_PTR gdiplustoken;
    GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);

    Bitmap* bmp = new Bitmap(L"gray.bmp");
    UINT height = bmp->GetHeight();
    UINT width  = bmp->GetWidth();
    unsigned short **iImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(iImg);
    for (j=0;j<height;j++) {
        iImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(iImg[j]);
    }
    unsigned short **oImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(oImg);
    for (j=0;j<height;j++) {
        oImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(oImg[j]);
    }
    Color color;
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            bmp->GetPixel(x, y, &color);
            iImg[y][x]=(unsigned short)color.GetRed();
        }
    }
    error_diffusion(width,height,iImg,oImg);
    Bitmap *clone = bmp->Clone(0,0,width,height,PixelFormat24bppRGB);
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            if (oImg[y][x]==1) color.SetValue(0xFFFFFFFF);
            else               color.SetValue(0xFF000000);
            clone->SetPixel(x, y, color);
        }
    }
    CLSID encoderClsid;
    GetEncoderClsid(L"image/bmp",&encoderClsid);
    clone->Save(L"diffusion.bmp",&encoderClsid);
    delete clone;
    for (j=0;j<height;j++) free(oImg[j]);
    free(oImg);
    for (j=0;j<height;j++) free(iImg[j]);
    free(iImg);
    delete bmp;
    GdiplusShutdown(gdiplustoken);
    return 0;
}
赵4老师 2016-02-03
  • 打赏
  • 举报
回复
引用 29 楼 wangyaninglm 的回复:
[quote=引用 17 楼 zhao4zhong1 的回复:] 都被版主推荐了,楼主你还没看出哪儿有问题吗?
大师,能否帮我看看openmp的版本怎么改写下[/quote] 我也没弄过openmp,但我相信你举一反三的能力还是有的。
21315415 2016-02-03
  • 打赏
  • 举报
回复
重中之重重中之重重中之重重中之重重中之重重中之重重中之重字字字字
cattpon 2016-02-02
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
#pragma comment(lib, "gdiplus.lib")
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#include <gdiplus.h>
#include <assert.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
}
void error_diffusion(unsigned int width,
                     unsigned int height,
                     unsigned short **InputImage,
                     unsigned short **OutputImage
    )
{
    for (unsigned int i = 0;i < height-1; i++)
    {
        for(unsigned int j = 1;j < width-1; j++)
        {
            //计算输出像素的值
            if (InputImage[i][j]<128)
            {
                OutputImage[i][j] = 0;
            }
            else{ OutputImage[i][j] = 1;}
            //计算误差值
            int err = (int)InputImage[i][j] - 255*OutputImage[i][j];
            //扩散误差
            int v;
            v=(int)InputImage[i  ][j+1];v+=err*7/16;if (v>255) v=255; if (v<0) v=0;InputImage[i  ][j+1]=(unsigned short)v;
            v=(int)InputImage[i+1][j-1];v+=err*3/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j-1]=(unsigned short)v;
            v=(int)InputImage[i+1][j  ];v+=err*5/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j  ]=(unsigned short)v;
            v=(int)InputImage[i+1][j+1];v+=err*1/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j+1]=(unsigned short)v;
        }
    }
}
int main()
{
    unsigned int j,y,x;

    GdiplusStartupInput gdiplusstartupinput;
    ULONG_PTR gdiplustoken;
    GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);

    Bitmap* bmp = new Bitmap(L"gray.bmp");
    UINT height = bmp->GetHeight();
    UINT width  = bmp->GetWidth();
    unsigned short **iImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(iImg);
    for (j=0;j<height;j++) {
        iImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(iImg[j]);
    }
    unsigned short **oImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(oImg);
    for (j=0;j<height;j++) {
        oImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(oImg[j]);
    }
    Color color;
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            bmp->GetPixel(x, y, &color);
            iImg[y][x]=(unsigned short)color.GetRed();
        }
    }
    error_diffusion(width,height,iImg,oImg);
    Bitmap *clone = bmp->Clone(0,0,width,height,PixelFormat24bppRGB);
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            if (oImg[y][x]==1) color.SetValue(0xFFFFFFFF);
            else               color.SetValue(0xFF000000);
            clone->SetPixel(x, y, color);
        }
    }
    CLSID encoderClsid;
    GetEncoderClsid(L"image/bmp",&encoderClsid);
    clone->Save(L"diffusion.bmp",&encoderClsid);
    delete clone;
    for (j=0;j<height;j++) free(oImg[j]);
    free(oImg);
    for (j=0;j<height;j++) free(iImg[j]);
    free(iImg);
    delete bmp;
    GdiplusShutdown(gdiplustoken);
    return 0;
}
这个应该是正解~
a1509259923 2016-02-02
  • 打赏
  • 举报
回复
膜拜大师~学习学习
a2048687 2016-02-02
  • 打赏
  • 举报
回复
看看大师大啊啊啊啊啊啊啊啊
shiter 2016-02-02
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
都被版主推荐了,楼主你还没看出哪儿有问题吗?
大师,能否帮我看看openmp的版本怎么改写下
Devil-Death 2016-02-02
  • 打赏
  • 举报
回复
老实说,不明所以,还需要努力修炼才行。。
michaelxiao612 2016-02-02
  • 打赏
  • 举报
回复
这是error diffusion halftone的算法,打印机的基本原理。我们实验室好多人走在研究halftone的算法
mewiteor 2016-02-01
  • 打赏
  • 举报
回复
越界还有:j=width-1时
InputImage[i][width] += err * 7/16;
InputImage[i+1][width] += err * 7/16;
mewiteor 2016-02-01
  • 打赏
  • 举报
回复
感觉用浮点类型更好一点,整数除法是取整运算,产生的误差会一直累积下来。 越界是指:j=0时
InputImage[i+1][-1] += err * 7/16;
以及你没有对最后一行像素进行扩散误差,最后一行只需:
InputImage[i][j+1] += err * 7/16;
mewiteor 2016-02-01
  • 打赏
  • 举报
回复
应该主要就是InputImage的符号问题 InputImage[i][j]的数据类型为unsigned short 如果128<=InputImage[i][j]<255 err==InputImage[i][j] - 255==65536-(255- InputImage[i][j]),是一个较大的数,这个err扩散到其它像素点会使其它像素点的值变得很大,都大于128,使得OutputImage[i][j]绝大多数是255,所以有一大片白色。
赵4老师 2016-02-01
  • 打赏
  • 举报
回复
我告诉你你印象不深刻。 自己对比吧。 提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
shiter 2016-02-01
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
#pragma comment(lib, "gdiplus.lib")
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#include <gdiplus.h>
#include <assert.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
}
void error_diffusion(unsigned int width,
                     unsigned int height,
                     unsigned short **InputImage,
                     unsigned short **OutputImage
    )
{
    for (unsigned int i = 0;i < height-1; i++)
    {
        for(unsigned int j = 1;j < width-1; j++)
        {
            //计算输出像素的值
            if (InputImage[i][j]<128)
            {
                OutputImage[i][j] = 0;
            }
            else{ OutputImage[i][j] = 1;}
            //计算误差值
            int err = (int)InputImage[i][j] - 255*OutputImage[i][j];
            //扩散误差
            int v;
            v=(int)InputImage[i  ][j+1];v+=err*7/16;if (v>255) v=255; if (v<0) v=0;InputImage[i  ][j+1]=(unsigned short)v;
            v=(int)InputImage[i+1][j-1];v+=err*3/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j-1]=(unsigned short)v;
            v=(int)InputImage[i+1][j  ];v+=err*5/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j  ]=(unsigned short)v;
            v=(int)InputImage[i+1][j+1];v+=err*1/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j+1]=(unsigned short)v;
        }
    }
}
int main()
{
    unsigned int j,y,x;

    GdiplusStartupInput gdiplusstartupinput;
    ULONG_PTR gdiplustoken;
    GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);

    Bitmap* bmp = new Bitmap(L"gray.bmp");
    UINT height = bmp->GetHeight();
    UINT width  = bmp->GetWidth();
    unsigned short **iImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(iImg);
    for (j=0;j<height;j++) {
        iImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(iImg[j]);
    }
    unsigned short **oImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(oImg);
    for (j=0;j<height;j++) {
        oImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(oImg[j]);
    }
    Color color;
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            bmp->GetPixel(x, y, &color);
            iImg[y][x]=(unsigned short)color.GetRed();
        }
    }
    error_diffusion(width,height,iImg,oImg);
    Bitmap *clone = bmp->Clone(0,0,width,height,PixelFormat24bppRGB);
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            if (oImg[y][x]==1) color.SetValue(0xFFFFFFFF);
            else               color.SetValue(0xFF000000);
            clone->SetPixel(x, y, color);
        }
    }
    CLSID encoderClsid;
    GetEncoderClsid(L"image/bmp",&encoderClsid);
    clone->Save(L"diffusion.bmp",&encoderClsid);
    delete clone;
    for (j=0;j<height;j++) free(oImg[j]);
    free(oImg);
    for (j=0;j<height;j++) free(iImg[j]);
    free(iImg);
    delete bmp;
    GdiplusShutdown(gdiplustoken);
    return 0;
}
赵大师太厉害,我那代码问题出在哪里了?
赵4老师 2016-02-01
  • 打赏
  • 举报
回复
#pragma comment(lib, "gdiplus.lib")
#include <stdlib.h>
#include <malloc.h>
#include <windows.h>
#include <gdiplus.h>
#include <assert.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
}
void error_diffusion(unsigned int width,
                     unsigned int height,
                     unsigned short **InputImage,
                     unsigned short **OutputImage
    )
{
    for (unsigned int i = 0;i < height-1; i++)
    {
        for(unsigned int j = 1;j < width-1; j++)
        {
            //计算输出像素的值
            if (InputImage[i][j]<128)
            {
                OutputImage[i][j] = 0;
            }
            else{ OutputImage[i][j] = 1;}
            //计算误差值
            int err = (int)InputImage[i][j] - 255*OutputImage[i][j];
            //扩散误差
            int v;
            v=(int)InputImage[i  ][j+1];v+=err*7/16;if (v>255) v=255; if (v<0) v=0;InputImage[i  ][j+1]=(unsigned short)v;
            v=(int)InputImage[i+1][j-1];v+=err*3/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j-1]=(unsigned short)v;
            v=(int)InputImage[i+1][j  ];v+=err*5/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j  ]=(unsigned short)v;
            v=(int)InputImage[i+1][j+1];v+=err*1/16;if (v>255) v=255; if (v<0) v=0;InputImage[i+1][j+1]=(unsigned short)v;
        }
    }
}
int main()
{
    unsigned int j,y,x;

    GdiplusStartupInput gdiplusstartupinput;
    ULONG_PTR gdiplustoken;
    GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);

    Bitmap* bmp = new Bitmap(L"gray.bmp");
    UINT height = bmp->GetHeight();
    UINT width  = bmp->GetWidth();
    unsigned short **iImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(iImg);
    for (j=0;j<height;j++) {
        iImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(iImg[j]);
    }
    unsigned short **oImg=(unsigned short **)malloc(height*sizeof(unsigned short *));
    assert(oImg);
    for (j=0;j<height;j++) {
        oImg[j]=(unsigned short *)malloc(width*sizeof(unsigned short));
        assert(oImg[j]);
    }
    Color color;
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            bmp->GetPixel(x, y, &color);
            iImg[y][x]=(unsigned short)color.GetRed();
        }
    }
    error_diffusion(width,height,iImg,oImg);
    Bitmap *clone = bmp->Clone(0,0,width,height,PixelFormat24bppRGB);
    for (y=0;y<height;y++) {
        for (x=0;x<width;x++) {
            if (oImg[y][x]==1) color.SetValue(0xFFFFFFFF);
            else               color.SetValue(0xFF000000);
            clone->SetPixel(x, y, color);
        }
    }
    CLSID encoderClsid;
    GetEncoderClsid(L"image/bmp",&encoderClsid);
    clone->Save(L"diffusion.bmp",&encoderClsid);
    delete clone;
    for (j=0;j<height;j++) free(oImg[j]);
    free(oImg);
    for (j=0;j<height;j++) free(iImg[j]);
    free(iImg);
    delete bmp;
    GdiplusShutdown(gdiplustoken);
    return 0;
}
加载更多回复(14)

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧