Untitled
unknown
plain_text
a year ago
3.1 kB
8
Indexable
int main(int argc, char *argv[]) {
if (argc != 4) {
fprintf(stderr, "Usage: %s <input_png> <output_png> <message>\n", argv[0]);
return 1;
}
const char *input_filename = argv[1];
const char *output_filename = argv[2];
const char *message = argv[3];
png_bytep *image = NULL;
int width, height;
// Read the input PNG image
read_png_file(input_filename, &image, &width, &height);
// Embed the message in the image
embed_message(image, width, height, message);
// Write the output PNG image
write_png_file(output_filename, image, width, height);
// Free memory
for (int y = 0; y < height; y++) {
free(image[y]);
}
free(image);
printf("Message embedded and saved to %s\n", output_filename);
return 0;
}
// Function to extract a message from an image using DCT
void extract_message(png_bytep *image, int width, int height, char *output_message, int max_length) {
int msg_index = 0;
int bit_value;
double block[BLOCK_SIZE][BLOCK_SIZE];
for (int y = 0; y < height && msg_index < max_length * 8; y += BLOCK_SIZE) {
for (int x = 0; x < width && msg_index < max_length * 8; x += BLOCK_SIZE) {
// Load an 8x8 block
for (int i = 0; i < BLOCK_SIZE; i++) {
for (int j = 0; j < BLOCK_SIZE; j++) {
if (y + i < height && x + j < width) {
block[i][j] = (double)image[y + i][4 * (x + j)];
} else {
block[i][j] = 0.0;
}
}
}
// Perform DCT on the block
dct(block);
// Extract the bit from DCT coefficients
bit_value = block[1][1] > 0 ? 1 : 0;
output_message[msg_index / 8] |= (bit_value << (7 - (msg_index % 8)));
msg_index++;
}
}
// Null-terminate the extracted message
output_message[msg_index / 8] = '\0';
}
// Function to read the embedded message
void read_embedded_message(const char *input_filename, int message_length) {
png_bytep *image = NULL;
int width, height;
char *extracted_message = malloc((message_length + 1) * sizeof(char));
memset(extracted_message, 0, (message_length + 1) * sizeof(char));
// Read the input PNG image
read_png_file(input_filename, &image, &width, &height);
// Extract the message from the image
extract_message(image, width, height, extracted_message, message_length);
// Free memory
for (int y = 0; y < height; y++) {
free(image[y]);
}
free(image);
printf("Extracted Message: %s\n", extracted_message);
free(extracted_message);
}
int main_extract(int argc, char *argv[]) {
if (argc != 3) {
fprintf(stderr, "Usage: %s <input_png> <message_length>\n", argv[0]);
return 1;
}
const char *input_filename = argv[1];
int message_length = atoi(argv[2]);
// Extract the message from the image
read_embedded_message(input_filename, message_length);
return 0;
}Editor is loading...
Leave a Comment