I'm trying to convert a png to RGBA buffer and send it via tcp sockets, I've made a socket but i'm a begginer at image manipulation, how should I convert it to RGBA buffer and send it via sockets? I'm trying to use ImageMagick because it has a c++ api and i need to make this project work on c++
Socket Server:
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <Magick++.h>
using namespace std;
class Server_socket{
fstream file;
int PORT;
int general_socket_descriptor;
int new_socket_descriptor;
struct sockaddr_in address;
int address_length;
public:
Server_socket(){
create_socket();
PORT = 8050;
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons( PORT );
address_length = sizeof(address);
bind_socket();
set_listen_set();
accept_connection();
file.open(".//Data//Server//image.png", ios::in | ios::binary);
if(file.is_open()){
cout<<"[LOG] : File is ready to Transmit.\n";
}
else{
cout<<"[ERROR] : File loading failed, Exititng.\n";
exit(EXIT_FAILURE);
}
}
void create_socket(){
if ((general_socket_descriptor = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("[ERROR] : Socket failed");
exit(EXIT_FAILURE);
}
cout<<"[LOG] : Socket Created Successfully.\n";
}
void bind_socket(){
if (bind(general_socket_descriptor, (struct sockaddr *)&address, sizeof(address))<0) {
perror("[ERROR] : Bind failed");
exit(EXIT_FAILURE);
}
cout<<"[LOG] : Bind Successful.\n";
}
void set_listen_set(){
if (listen(general_socket_descriptor, 3) < 0) {
perror("[ERROR] : Listen");
exit(EXIT_FAILURE);
}
cout<<"[LOG] : Socket in Listen State (Max Connection Queue: 3)\n";
}
void accept_connection(){
if ((new_socket_descriptor = accept(general_socket_descriptor, (struct sockaddr *)&address, (socklen_t*)&address_length))<0) {
perror("[ERROR] : Accept");
exit(EXIT_FAILURE);
}
cout<<"[LOG] : Connected to Client.\n";
}
void transmit_file(){
std::string contents((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
cout<<"[LOG] : Transmission Data Size "<<contents.length()<<" Bytes.\n";
cout<<"[LOG] : Sending...\n";
int bytes_sent = send(new_socket_descriptor , contents.c_str() , contents.length() , 0 );
cout<<"[LOG] : Transmitted Data Size "<<bytes_sent<<" Bytes.\n";
cout<<"[LOG] : File Transfer Complete.\n";
}
};
int main(){
Server_socket S;
S.transmit_file();
return 0;
}
EDIT: I found a method from this gentleman, i'm currently saving as txt to see what i got, can anyone confirm me if the data is correct (converted from png to rgba), and if it is, how can i send to my client socket as a buffer?
InitializeMagick(NULL);
Magick::Image image;
image.read("/home/img.png");
size_t image_size = image.columns() * image.rows() * 4;
uint8_t * pixels = new uint8_t[image_size];
image.write(0, 0, image.columns(), image.rows(), "RGBA", ::Magick::CharPixel, pixels);
image.write("/home/img.txt");