【问题标题】:How to show an image from internet in wxWidgets by c++?如何通过c ++在wxWidgets中显示来自互联网的图像?
【发布时间】:2013-10-05 18:43:57
【问题描述】:

我在 wxFormBuilder 制作的表单上添加了wxStaticBitmap

show_image = new wxStaticBitmap( this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, 0 );

如何使用 C++ 和 Curl 在其上显示基于 Internet 的图像?比如这样一张图片:

https://www.google.com/images/srpr/logo4w.png

【问题讨论】:

  • 图片必须来自互联网吗?在本地缓存并从那里显示不是更有意义吗?
  • 我可以通过curl下载到本地磁盘,并从磁盘显示图像,我想知道有什么办法不使用本地磁盘

标签: c++ curl wxwidgets wxformbuilder


【解决方案1】:
 #include <string> 
 #include <iostream> 
 #include <wx/string.h> 
 #include <wx/image.h> 
 #include <curl/curl.h> 
 struct MemoryStruct {                                                  
     char *memory;  
     size_t read_pos; 
     size_t size;  
 };  
 static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp) 
 {                                                                      
     register int realsize = size * nmemb;                              
     struct MemoryStruct *mem = (struct MemoryStruct *)userp;           
     mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);    
     if (mem->memory) {                                                 
         memcpy(&(mem->memory[mem->size]), contents, realsize);         
         mem->size += realsize;    
         mem->memory[mem->size] = 0;                                    
     }    
     return realsize;  
 }  
 wxImage *DownloadImage(string image_url) 
 { 
     wxImage *pImg = NULL; 
     struct MemoryStruct chunk; 
     CURL* curlCtx = curl_easy_init(); 
     curl_easy_setopt(curlCtx, CURLOPT_URL, image_url.c_str()); 
     curl_easy_setopt(curlCtx, CURLOPT_WRITEDATA, (void *)&chunk); 
     curl_easy_setopt(curlCtx, CURLOPT_WRITEFUNCTION, WriteCallback); 
     curl_easy_setopt(curlCtx, CURLOPT_FOLLOWLOCATION, 1); 
     chunk.memory=NULL;  
     chunk.size = 0;  
     CURLcode rc = curl_easy_perform(curlCtx); 
      if (rc) 
     { 
         printf("!!! Failed to download\n"); 
     } 
   wxMemoryInputStream *memin = new wxMemoryInputStream(chunk.memory, chunk.size); 
     if((pImg = new wxImage()) != NULL){ 
         if(!pImg->LoadFile(*memin, wxBITMAP_TYPE_JPEG)){ 
             delete pImg; 
             pImg = NULL; 
         } 
     } 
     curl_easy_cleanup(curlCtx); 
     return pImg; 
 } 
 wxImage imagewx = *DownloadImage("https://www.google.com/images/srpr/logo4w.png"); 
 if(imagewx.IsOk()){ 
     show_image->SetBitmap(wxBitmap(imagewx)); 
 } 

我不确定那是正确的方法,但它对我有用

【讨论】:

  • 你在这里泄露了wxMemoryInputStream。最简单的方法是将其分配在堆栈上,而不是堆上。 wxImage 也是如此:您也在泄漏它,并且再次将其用作“值”而不是指针。
猜你喜欢
  • 1970-01-01
  • 2020-08-02
  • 2014-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 2023-03-31
  • 2021-07-03
  • 2019-05-13
相关资源
最近更新 更多