lsb.c

来自「信息隐藏与水印技术的经典隐写算法的lsb算法的加密」· C语言 代码 · 共 88 行

C
88
字号
// Author: chenxiang
// Data: 2008-04-09
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
using namespace std;
typedef struct 
{
	BYTE red;
	BYTE green;
	BYTE blue;
}RGB24;

int main(int argc, char *argv[])
{
	if (argc != 2)
	{
		printf("help\n");
		printf("    lsb  *.bmp\n");

		return 1;
	}

	FILE *fin, *fout;
	
	fin = fopen(argv[1], "rb");
	if (fin == NULL)
	{
		return 0;
	}
	
	char filename[256];
	WORD filesize;

	strcpy(filename, argv[1]);
	strcat(filename, "_result.bmp");
	fout = fopen(filename, "wb");
	if (fout == NULL)
	{
		fclose(fin);

		return 0;
	}

	BITMAPFILEHEADER bmfHeader;
	BITMAPINFOHEADER bmiHeader;

	fread(&bmfHeader, sizeof(bmfHeader), 1, fin);
	filesize = bmfHeader.bfReserved1;
	fread(&bmiHeader, sizeof(bmiHeader), 1, fin);

	RGB24 rgb;
	BYTE *array = (BYTE *)malloc(sizeof(BYTE) * bmiHeader.biHeight * bmiHeader.biWidth * 3);
	LONG i, j, k;

	k = 0;
	for (i = 0; i < bmiHeader.biHeight; i++)
	{
		for (j = 0; j < bmiHeader.biWidth; j++)
		{
			fread(&rgb, sizeof(rgb), 1, fin);
			array[k++] = rgb.red & 0x01;
			array[k++] = rgb.green & 0x01;
			array[k++] = rgb.blue & 0x01;
		}
	}

	BYTE data;
	for (i = 0; i < filesize; i++)
	{
		data = 0;
		for (j = 0; j < 8; j++)
		{
			data += array[8 * i + j] * pow(2, 7 - j);
		}

		fwrite(&data, sizeof(data), 1, fout);
	}

	free(array);

	fclose(fin);
	fclose(fout);

	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?