2013-10-07 4 views
1

Я пытаюсь написать клиента для загрузки изображений. Я использую этот код, чтобы захватить скриншот и записать его в переменную hBitmap. Затем я хочу загрузить его, используя код под этим, но я не знаю, как конвертировать или, возможно, переформатировать изображение. Я не хочу, чтобы написать изображение в файл, а затем считывания файла, который будет легко;)Создание и загрузка скриншотов

// get the device context of the screen 
HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);  
// and a device context to put it in 
HDC hMemoryDC = CreateCompatibleDC(hScreenDC); 

int x = GetDeviceCaps(hScreenDC, HORZRES); 
int y = GetDeviceCaps(hScreenDC, VERTRES); 

// maybe worth checking these are positive values 
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDc, x, y); 

// get a new bitmap 
HBITMAP hOldBitmap = SelectObject(hMemoryDC, hBitmap); 

BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY); 
hBitmap = SelectObject(hMemoryDC, hOldBitmap); 

// clean up 
DeleteDC(hMemoryDC); 
DeleteDC(hScreenDC); 

Это мой Выгрузка код:

void HTTP_UPLOAD_REQUEST(char * Server,int Port,char * uploadscript,char* boundary,char*filetoup,char* data) 
{ 
//Create Socket for sending data 
WSADATA wsaData; 
WSAStartup(MAKEWORD(1,1), &wsaData); 
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 
LPHOSTENT hostEntry; 
hostEntry = gethostbyname(Server);//Get ip from Server by hostname 
sockaddr_in addr; 
addr.sin_family = AF_INET; 
addr.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list); 
addr.sin_port = htons(Port); //Set Port 
connect(Socket, (LPSOCKADDR) &addr, sizeof(struct sockaddr)); 
//Socket created and connected to Server! 

//Create HTTP POST Request 
//construct POST Header 
char header[512]=""; 
sprintf(header, "POST %s HTTP/1.0\r\nContent-Type: multipart/form-data; boundary=%s\r\nContent-Length: %u\r\n\r\n",uploadscript, boundary,2*strlen(data)); 

//construct Body(data part) of HTTP POST 
char* body=new char[strlen(data)+4000]; 
sprintf(body, "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n\r\n %s\r\n--%s\r\n",boundary,"data",filetoup,data,boundary); 

//Put Header and Body together into Request 
char * Request=new char[strlen(header)+strlen(body)+strlen(data)]; 
sprintf(Request, "%s%s", header,body); 

//int bytestosend = strlen(Request); 
int bytessend =send(Socket, Request, strlen(Request), 0); 


closesocket(Socket);//cleanup -! 

} 

ответ

0
  1. Что вы теперь представляют собой необработанные растровые данные. Допустимый файл bitmap (* .bmp) также должен содержать заголовок BMP. Существует хорошее article.

    Возможно, вы захотите преобразовать огромный файл BMP в формат jpeg или png. Например, Free image способен выполнять такое преобразование в памяти.

  2. Если вам нужно загрузить данные в Интернет, рассмотрите возможность использования надежной сетевой библиотеки, например libcurl. У вашей реализации есть несколько утечек памяти.

    Моя рекомендация также заключается в использовании std::string или std::vector везде, где это возможно. Это дает не только без утечек, но и более хороший код:

    void HTTP_UPLOAD_REQUEST(std::string Server, unsigned short Port, std::string uploadscript, std::string boundary, std::string filetoup, std::string data) 
    { 
        ... 
    
        std::stringstream out; 
    
        out << "POST " << uploadscript << " HTTP/1.0\r\n"; 
        out << "Content-Type: multipart/form-data; boundary=" << boundary << "\r\n"; 
        out << "Content-Length: " << data.size(); 
    
        out << "--" << boundary << "\r\n"; 
        out << "Content-Disposition: form-data; name=\"data\"; filename=\"" 
         << filetoup << "\"\r\n\r\n"; 
    
        out << data << "\r\n--" << boundary << "\r\n"; 
    
        std::string toSend = out.str(); 
        int bytessend = send(Socket, toSend.c_str(), toSend.size(), 0); 
        ... 
    } 
    

    Обратите внимание, что WSAStartup должна вызываться только один раз в программе, не каждый вызов к HTTP_UPLOAD_REQUEST

+0

Мне не разрешается использовать какие-либо другие файлы, кроме основной программы, и если я правильно помню, что libcurl нуждается в некоторых dll. – user2855954

+0

libcurl можно связать статически (без dll's). Если вам не разрешено использовать его, по крайней мере исправить утечки памяти. Я бы рекомендовал использовать 'std :: string' вместо' char * '. –

+0

В какой момент я должен использовать строку (мое пространство имен установлено на std), можете ли вы предоставить мой рабочий пример? – user2855954

Смежные вопросы