簡體   English   中英

如何讀取圖像文件並將其存儲在c ++的內存(std :: string)中?

[英]how to read image files and store it in memory(std::string) in c++?

我今天大部分時間都在線研究,但找不到答案,所以我轉向stackoverflow提出一些建議。

基本上,我有一個c ++庫,使用curl執行PUT方法上傳圖像文件。 現在這個庫為數據采用std :: string。 我在本地磁盤上有圖像文件(如jpg,gif,png)。

我不關心文件的內容(因為,除了將其傳遞給PUT方法的庫之外,我不做任何事情)。 我怎樣才能讀取圖像文件並將其存儲在std :: string中? 如果文件內容包含NULL終止符怎么辦?

我試圖添加一些我嘗試過的代碼,但我是新來的,我不知道如何以正確的格式粘貼我的代碼。 任何幫助,將不勝感激。

我能想到的最簡單的方法。 以二進制模式打開文件,然后將整個內容讀入stringstream

std::ifstream fin("foo.png", std::ios::in | std::ios::binary);
std::ostringstream oss;
oss << fin.rdbuf();
std::string data(oss.str());
std::ifstream fin("foo.png", std::ios::binary);
std::string data;
data.reserve(1000000);
std::copy(std::istreambuf_iterator<char>(fin),
          std::istreambuf_iterator<char>(),
          std::back_inserter(data));

您可以使用這樣的代碼將圖像文件讀取到std::string reserve方法的參數調整為大於文件大小的99%。 使用ifstreamstring正確處理零字節(您調用NULL終止符)。


我發現了一篇很好的文章 ,其中比較了幾種二進制文件加載方法。 這是該文章中最快的方法:

std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
std::string data;
data.resize(fin.tellg());
fin.seekg(0, std::ios::beg);
fin.read(&data[0], data.size());

這是最短的一個:

std::ifstream fin("foo.png", std::ios::binary);
std::string data((std::istreambuf_iterator<char>(fin)),
                 std::istreambuf_iterator<char>());

更新

像這樣的東西可以用來提供回調函數(我沒有測試它):

std::ifstream fin("foo.png", std::ios::binary);
fin.seekg(0, std::ios::end);
...
curl_easy_setopt(m_ctx, CURLOPT_INFILESIZE,    fin.tellg());
curl_easy_setopt(m_ctx, CURLOPT_READDATA,      (void *)&fin);
fin.seekg(0, std::ios::beg);
...
static size_t put_callback(void *ptr, size_t size, size_t nmemb, void *data){
  std::ifstream* in = static_cast<std::ifstream*>(data);
  if(in->eof()) return 0;
  in->read((char *)ptr, size*nmemb);
  return in->gcount();
}

這就是庫如何進行PUT調用,其中'data'是作為文件內容傳入的字符串

stringstream data_stream.str(data.c_str());
curl_easy_setopt(m_ctx, CURLOPT_UPLOAD,        1L);
curl_easy_setopt(m_ctx, CURLOPT_PUT,           1L);
curl_easy_setopt(m_ctx, CURLOPT_INFILESIZE,    data.length());
curl_easy_setopt(m_ctx, CURLOPT_READFUNCTION,  put_callback);
curl_easy_setopt(m_ctx, CURLOPT_READDATA,      (void *)&data_stream);
curl_easy_setopt(m_ctx, CURLOPT_WRITEFUNCTION, get_callback);
curl_easy_setopt(m_ctx, CURLOPT_WRITEDATA,     (void *)&m_request_response);

這是curlopt_readfunction的回調函數

static size_t put_callback(void *ptr, size_t size, size_t nmemb, void *data){

  stringstream *output_stream;
  int          retval;

  output_stream = (stringstream *) data;

  if(output_stream->eof()) return 0;

  retval = min(size*nmemb,output_stream->str().size());
  output_stream->read((char *)ptr, retval);

  //return the number of bytes processed 
  return retval;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM