Projeto ITP - Esteganografia 1.0
Carregando...
Procurando...
Nenhuma entrada encontrada
Referência à classe Image

Define uma imagem PPM alocada dinamicamente e fornece vários métodos para manipular e acessar os dados da imagem. Mais...

#include <Image.h>

Membros públicos

 Image ()
 Construtor padrão para a classe Image.
 
 Image (int w, int h)
 Construtor para inicializar uma imagem com largura e altura fornecidas.
 
int GetWidth () const
 Obtém a largura da imagem.
 
int GetHeight () const
 Obtém a altura da imagem.
 
void AllocatePixels ()
 Alocação de memória da matriz de pixels, fundamental na definição de qualquer objeto Image.
 
void LiberatePixels ()
 Libera a memória previamente alocada pela função AllocatePixels(), bem como a memória alocada pelo array dos valores 'R', 'G' e 'B' dos pixels.
 
void GetPixels ()
 Função que preenche a matriz de pixels.
 
void PrintPPM () const
 Função que imprime os parâmetros de uma imagem PPM. Usada para fins de teste.
 
bool ExtensionCheck (const string &input_text, const string &file_type)
 Função que verifica se uma string termina com a substring válida.
 
string CreatePPM () const
 Função que cria uma string contendo todos os dados de uma imagem PPM.
 
bool ReadPPM (const string &file_name)
 Lê e armazena dinamicamente o conteúdo de uma imagem de um arquivo PPM válido.
 
void ShowArray () const
 Função que exibe um array previamente definido de valores 'R', 'G' e 'B'. Usada para fins de teste.
 
string IntToBin (int num, int bits=8)
 Função recursiva para converter um valor inteiro em um valor binário.
 
void CodeMsg (string msg)
 Função principal usada na codificação e ocultação de uma mensagem ASCII nos bits menos significativos (LSB) dos pixels de uma imagem PPM.
 
int BinToInt (string bin_num, int index=0)
 Função recursiva usada para converter um valor binário em um valor inteiro.
 
void DecodeMsg ()
 Função principal usada para descobrir e decodificar uma mensagem ASCII oculta nos bits menos significativos (LSB) dos pixels de uma imagem PPM.
 

Descrição detalhada

Define uma imagem PPM alocada dinamicamente e fornece vários métodos para manipular e acessar os dados da imagem.

Documentação dos Construtores & Destrutor

◆ Image() [1/2]

Image::Image ( )
inline

Construtor padrão para a classe Image.

43 : width(0), height(0), pixel(nullptr), pixel_array(nullptr)
44 {}

◆ Image() [2/2]

Image::Image ( int w,
int h )
inline

Construtor para inicializar uma imagem com largura e altura fornecidas.

< Esta variável define o tamanho do array de pixels, contando cada valor 'R', 'G' e 'B' como uma unidade separada do array.

49 : width(w), height(h)
50 {
51 size = (width * height) * 3;
52 }

Documentação das funções

◆ AllocatePixels()

void Image::AllocatePixels ( )
inline

Alocação de memória da matriz de pixels, fundamental na definição de qualquer objeto Image.

74 {
75 pixel = new Pixel *[height];
76 for (int i = 0; i < height; i++)
77 {
78 pixel[i] = new Pixel[width];
79 }
80 }
Struct que define o pixel de uma imagem PPM.
Definição Image.h:22

◆ BinToInt()

int Image::BinToInt ( string bin_num,
int index = 0 )
inline

Função recursiva usada para converter um valor binário em um valor inteiro.

Parâmetros
bin_numString contendo o valor binário que será convertido em um inteiro.
indexO índice da string.
Retorna
a soma do valor atual e subsequente adquirido recursivamente.

Caso base: se o índice atingir o final da string binária.

Chamada recursiva para calcular o valor do dígito binário atual e subsequente.

360 {
362 if (index == bin_num.length())
363 {
364 return 0;
365 }
366
368 int value_current = (bin_num[index] - '0') * pow(2, bin_num.length() - 1 - index);
369 int value_subsequent = BinToInt(bin_num, index + 1);
370
371 return value_current + value_subsequent;
372 }
int BinToInt(string bin_num, int index=0)
Função recursiva usada para converter um valor binário em um valor inteiro.
Definição Image.h:359

◆ CodeMsg()

void Image::CodeMsg ( string msg)
inline

Função principal usada na codificação e ocultação de uma mensagem ASCII nos bits menos significativos (LSB) dos pixels de uma imagem PPM.

Parâmetros
msgMensagem que será armazenada dentro da imagem.

‍O número de caracteres na mensagem.

‍Array que armazena os valores ASCII de cada um dos caracteres da mensagem.

Preenche o array chars[].

Armazena o valor binário do número de caracteres na mensagem.

Modificação dos primeiros 8 bits do array de valores 'R', 'G' e 'B' que armazena o tamanho da mensagem.

Modifica os bits do array de valores 'R', 'G' e 'B' que armazenarão a mensagem real.

‍Índice para cada um dos bits da mensagem.

292 {
293 int t = msg.size();
294 int chars[t];
297 for (int i = 0; i < t; ++i)
298 {
299 chars[i] = (int)msg[i];
300 }
301
303 string bin = IntToBin(t);
304
306 for (int i = 0; i < 8 && i < size; ++i)
307 {
308 if (bin[i] == '1')
309 {
310 if (pixel_array[i] % 2 == 0)
311 {
312 pixel_array[i]++;
313 }
314 }
315 else
316 {
317 if (pixel_array[i] % 2 != 0)
318 {
319 pixel_array[i]++;
320 }
321 }
322 }
323
325 int bit_index = 0;
326 for (int j = 0; j < t; ++j)
327 {
328 bin = IntToBin(chars[j]);
329 for (int i = 0; i < 8 && (bit_index + 8) < size; ++i, ++bit_index)
330 {
331 if (bin[i] == '1')
332 {
333 if (pixel_array[bit_index + 8] % 2 == 0)
334 {
335 pixel_array[bit_index + 8]++;
336 }
337 }
338 else
339 {
340 if (pixel_array[bit_index + 8] % 2 != 0)
341 {
342 pixel_array[bit_index + 8]++;
343 if (pixel_array[bit_index + 8] == 255)
344 {
345 pixel_array[bit_index + 8]--;
346 }
347 }
348 }
349 }
350 }
351 }
string IntToBin(int num, int bits=8)
Função recursiva para converter um valor inteiro em um valor binário.
Definição Image.h:270

◆ CreatePPM()

string Image::CreatePPM ( ) const
inline

Função que cria uma string contendo todos os dados de uma imagem PPM.

Retorna
todas as informações necessárias para definir uma imagem PPM.

Obtém os pixels de um array de pixels previamente definido.

174 {
175 stringstream img_content;
176
177 img_content << "P3" << endl;
178 img_content << width << " " << height << endl;
179 img_content << max_color << endl;
180
182 for (int i = 0; i < size; i += 3)
183 {
184 img_content << pixel_array[i] << " " << pixel_array[i + 1] << " " << pixel_array[i + 2] << " ";
185 if ((i / 3 + 1) % width == 0)
186 {
187 img_content << endl;
188 }
189 }
190 return img_content.str();
191 }

◆ DecodeMsg()

void Image::DecodeMsg ( )
inline

Função principal usada para descobrir e decodificar uma mensagem ASCII oculta nos bits menos significativos (LSB) dos pixels de uma imagem PPM.

‍String que armazena o tamanho da mensagem em binário.

Obtém (em binário) o tamanho da mensagem armazenada na imagem a partir dos primeiros 8 bits dos valores 'R', 'G' e 'B' dos pixels, previamente armazenados em um array.

Adiciona o caractere '0' a bin_size.

Adiciona o caractere '1' a bin_size.

‍String que armazena a mensagem ASCII em binário.

‍Armazena o tamanho da imagem como um valor inteiro.

Obtém (em binário) a mensagem armazenada na imagem, usando o tamanho da mensagem e usando o array de valores 'R', 'G' e 'B' dos pixels.

Adiciona o caractere '0' a bin_msg.

Adiciona o caractere '1' a bin_msg.

‍String que armazena a mensagem completamente decodificada.

Repete o processo abaixo até que todos os caracteres da mensagem tenham sido decodificados e armazenados.

‍Armazena um valor binário de um único caractere.

Obtém 8 bits (ou um único caractere) da mensagem em binário, então adiciona até que faça o mesmo com o próximo bit (se houver um próximo bit).

‍Armazena o caractere ASCII decodificado como um char.

Empurra um novo caractere decodificado na string que armazena a mensagem.

378 {
379 string bin_size;
382 for (int i = 0; i < 8; ++i)
383 {
384 if (pixel_array[i] % 2 == 0)
385 {
386 bin_size.push_back('0');
387 }
388 else
389 {
390 bin_size.push_back('1');
391 }
392 }
393
394 string bin_msg;
395 int msg_size = BinToInt(bin_size);
398 for (int i = 8; i < 8 + (msg_size * 8); ++i)
399 {
400 if (pixel_array[i] % 2 == 0)
401 {
402 bin_msg.push_back('0');
403 }
404 else
405 {
406 bin_msg.push_back('1');
407 }
408 }
409
410 string decoded_msg;
413 for (int j = 0; j < msg_size; ++j)
414 {
415 string bin_char;
418 for (int i = 0; i < 8; ++i)
419 {
420 bin_char.push_back(bin_msg[i + (8 * j)]);
421 }
422
423 char single_char = BinToInt(bin_char);
426 decoded_msg.push_back(single_char);
427 }
428 cout << "\033[94mA mensagem escondida é: \033[0m" + decoded_msg << "\n";
429 }

◆ ExtensionCheck()

bool Image::ExtensionCheck ( const string & input_text,
const string & file_type )
inline

Função que verifica se uma string termina com a substring válida.

Parâmetros
input_textTexto inserido na função, que deve ser verificado.
file_typeA substring que você deseja verificar se existe no final de uma determinada string.
Retorna
true se a substring existir no final da string fornecida, false caso contrário.
158 {
159 if (input_text.length() >= file_type.length())
160 {
161 return (input_text.compare(input_text.length() - file_type.length(), file_type.length(), file_type) == 0);
162 }
163 else
164 {
165 return false;
166 }
167 }

◆ GetHeight()

int Image::GetHeight ( ) const
inline

Obtém a altura da imagem.

66 {
67 return height;
68 }

◆ GetPixels()

void Image::GetPixels ( )
inline

Função que preenche a matriz de pixels.

108 {
109 for (int h = 0; h < height; h++)
110 {
111 for (int w = 0; w < width; w++)
112 {
113 int r, g, b;
114 cin >> r >> g >> b;
115 pixel[h][w].r = r;
116 pixel[h][w].g = g;
117 pixel[h][w].b = b;
118 }
119 }
120 }
unsigned char r
Definição Image.h:23
unsigned char b
Definição Image.h:23
unsigned char g
Definição Image.h:23

◆ GetWidth()

int Image::GetWidth ( ) const
inline

Obtém a largura da imagem.

58 {
59 return width;
60 }

◆ IntToBin()

string Image::IntToBin ( int num,
int bits = 8 )
inline

Função recursiva para converter um valor inteiro em um valor binário.

Parâmetros
numValor inteiro a ser convertido em valor binário.
bitsO tamanho máximo do valor binário a ser retornado.
Retorna
uma string contendo a representação binária do número recebido.

Caso base: quando não restam mais bits para converter.

Determina o bit atual em binário.

Chamada recursiva para calcular os bits remanescentes em binário.

271 {
273 if (bits == 0)
274 {
275 return "";
276 }
277
279 int bit_current = num % 2;
280
282 string bit_subsequent = IntToBin(num / 2, bits - 1);
283
284 return bit_subsequent + (bit_current == 0 ? '0' : '1');
285 }

◆ LiberatePixels()

void Image::LiberatePixels ( )
inline

Libera a memória previamente alocada pela função AllocatePixels(), bem como a memória alocada pelo array dos valores 'R', 'G' e 'B' dos pixels.

Libera a memória utilizada pelo array dos valores 'R', 'G' e 'B' dos pixels, usado nas funções CreatePPM(), ReadPPM(), ShowArray(), CodeMsg() e DecodeMsg().

86 {
87 if (pixel != nullptr)
88 {
89 for (int i = 0; i < height; i++)
90 {
91 delete[] pixel[i];
92 }
93 delete[] pixel;
94 pixel = nullptr;
95 }
97 if (pixel_array != nullptr)
98 {
99 delete[] pixel_array;
100 pixel_array = nullptr;
101 }
102 }

◆ PrintPPM()

void Image::PrintPPM ( ) const
inline

Função que imprime os parâmetros de uma imagem PPM. Usada para fins de teste.

126 {
127 cout << "\033[94mDados da imagem: \033[0m\n";
128 cout << "\033[33m- Comprimento: \033[0m\n"
129 << width << endl;
130 cout << "\033[33m- Largura: \033[0m\n"
131 << height << endl;
132 cout << "\033[33m- Tipo de imagem: \033[0m\n"
133 << img_type << endl;
134 cout << "\033[33m- Valor máximo de cor: \033[0m\n"
135 << max_color << endl;
136 cout << "\033[33m- Valor RGB de cada pixel:\033[0m\n";
137
138 for (int h = 0; h < height; h++)
139 {
140 for (int w = 0; w < width; w++)
141 {
142 Pixel p = pixel[h][w];
143 cout << (int)p.r << " ";
144 cout << (int)p.g << " ";
145 cout << (int)p.b << " ";
146 }
147 cout << endl;
148 }
149 cout << endl;
150 }

◆ ReadPPM()

bool Image::ReadPPM ( const string & file_name)
inline

Lê e armazena dinamicamente o conteúdo de uma imagem de um arquivo PPM válido.

Parâmetros
file_nameO nome de um arquivo PPM armazenado previamente dentro da pasta de origem, que será lido pela função.
Retorna
true se a imagem foi lida com sucesso, false caso contrário.

Testa se o arquivo existe dentro da pasta de origem.

Testa se o arquivo é de fato um arquivo P3/PPM.

Alocação de memória do array de pixels, usado na decodificação e codificação.

Lê e armazena em um array os valores 'R', 'G' e 'B' dos pixels.

199 {
201 ifstream file(file_name);
202 if (!file)
203 {
204 cerr << "\033[31mErro de leitura. O arquivo " << file_name << " não existe.\033[0m\n";
205 return false;
206 }
207
208 string file_type;
209 file >> file_type;
210
212 if (file_type != "P3")
213 {
214 cerr << "\033[31mErro de leitura. O arquivo " << file_name << " não é uma imagem PPM no formato P3.\033[0m\n"
215 << endl;
216 return false;
217 }
218
219 file >> width >> height >> max_color;
220 size = width * height * 3;
221
223
225 pixel_array = new int[size];
226 int index = 0;
227
228 for (int h = 0; h < height; h++)
229 {
230 for (int w = 0; w < width; w++)
231 {
232 int r, g, b;
233 file >> r >> g >> b;
234 pixel[h][w].r = r;
235 pixel[h][w].g = g;
236 pixel[h][w].b = b;
238 pixel_array[index++] = r;
239 pixel_array[index++] = g;
240 pixel_array[index++] = b;
241 }
242 }
243 file.close();
244 return true;
245 }
void AllocatePixels()
Alocação de memória da matriz de pixels, fundamental na definição de qualquer objeto Image.
Definição Image.h:73

◆ ShowArray()

void Image::ShowArray ( ) const
inline

Função que exibe um array previamente definido de valores 'R', 'G' e 'B'. Usada para fins de teste.

251 {
252 if (pixel_array == nullptr)
253 {
254 cout << "Array não inicializado." << endl;
255 return;
256 }
257 for (int i = 0; i < size; i += 3)
258 {
259 cout << "Pixel [" << i / 3 << "]: R = " << pixel_array[i] << ", G = " << pixel_array[i + 1]
260 << ", B = " << pixel_array[i + 2] << endl;
261 }
262 }

A documentação para esta classe foi gerada a partir do seguinte ficheiro: