// jpg.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <atlimage.h>
#include <gdiplus.h>
#include<direct.h>
#include<fstream>
#include<iostream>
using namespace std;
void hide3jpg()
{
ofstream of("5_2.jpg",ios::app|ios::binary);
of<<"welcome to mianyang!";
of.close();
}
void hide3jpg1()
{
long int size=0;
HANDLE hfile = CreateFileA("5_2.jpg", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if(hfile!=INVALID_HANDLE_VALUE)
{
size=GetFileSize(hfile,NULL);
CloseHandle(hfile);
}
FILE* fid;
fopen_s(&fid,"5_2.jpg","rb");
rewind(fid);
BYTE *pos = (BYTE*) malloc (sizeof(BYTE)*size);
fread(pos,sizeof(BYTE),size,fid);
for(int i=0;i<size;i++)
{
if(pos[i]==255&&pos[i]+1==217)//图片首次FFD9的位置
{
if(i==size-2) //FFD9在最后位置
cout<<"图片尾部无隐写"<<endl;
else
cout<<"图片尾部有隐写"<<endl;
break;
}
}
fclose(fid);
}
void headhidejpg()//头部隐写
{
long int size=0;
HANDLE hfile = CreateFileA("5_2.jpg", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if(hfile!=INVALID_HANDLE_VALUE)
{
size=GetFileSize(hfile,NULL);
CloseHandle(hfile);
}
char *a="welcome to mianyang!";
int len=strlen(a);
int biaozhi[4]={255,39,0,(len+2)};//标记ff,46
cout<<len;
FILE* fid;
FILE* fid1;
fopen_s(&fid,"5_2.hidehead.jpg","wb");
fopen_s(&fid1,"5_2.jpg","rb");
rewind(fid1);
BYTE *pos = (BYTE*) malloc (sizeof(BYTE)*size);
fread(pos,sizeof(BYTE),size,fid1);
int b=pos[5]+4;//FFD8后面的第一个FF标记所代表的内容最后一个比特的定位
cout<<b;
for(int i=0;i<b;i++)
{
fwrite(&pos[i],sizeof(BYTE),1,fid);//向新文件写入第一个FF标记内容
}
for(int i=0;i<4;i++)
{
fwrite(&biaozhi[i],sizeof(BYTE),1,fid);//写入标记信息
}
for(int i=0;i<len;i++)
{
fwrite(&a[i],sizeof(char),1,fid);//写入隐藏内容
}
for(int i=b;i<size;i++)
{
fwrite(&pos[i],sizeof(BYTE),1,fid);//写入第一个FF标记之后的内容
}
fclose(fid);
fclose(fid1);
system("pause");
}
void headhidejpg1()//头部隐写提取
{
long int size=0;
HANDLE hfile = CreateFileA("5_2.hidehead.jpg", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if(hfile!=INVALID_HANDLE_VALUE)
{
size=GetFileSize(hfile,NULL);
CloseHandle(hfile);
}
FILE* fid;
fopen_s(&fid,"5_2.hidehead.jpg","rb");
BYTE *pos = (BYTE*) malloc (sizeof(BYTE)*size);
fread(pos,sizeof(BYTE),size,fid);
int j,k=0;
for(int i=0;i<size;i++)
{
if(pos[i]==255&&pos[i+1]==70)//标记信息为FF 46
{ j=i+3;break; }//j为该字段大小
}
cout<<"隐写数据为:"<<endl;
for(int i=j+1;i<(pos[j]+j)-1;i++)//
{
cout<<pos[i];
}
cout<<endl;
fclose(fid);
system("pause");
}
void midhidejpg()//数据区隐写
{
long int size=0;
HANDLE hfile = CreateFileA("5_2.jpg", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if(hfile!=INVALID_HANDLE_VALUE)
{
size=GetFileSize(hfile,NULL);
CloseHandle(hfile);
}
int biaozhi[4]={109,109};
char *a="mianyang";
int len=strlen(a);
FILE* file=NULL;
FILE* file1=NULL;
fopen_s(&file,"5_2.midhide.jpg","wb");
fopen_s(&file1,"5_2.jpg","rb");
BYTE *pos = (BYTE*) malloc (sizeof(BYTE)*size);
rewind(file1);
fread(pos,sizeof(BYTE),size,file1);
int j=0,k=0,l=0;
for(int i=0;i<size;i++)
{
if(pos[i]==255&&pos[i+1]==218) //sos
{
j=1,k=pos[i+3]+i+1;
k+=8; //数据区第8位
}
if(j==1&&i>=k)
{
fwrite(&biaozhi[0],sizeof(BYTE),1,file);
j=2;;
}
else if(j==2)
{
fwrite(&biaozhi[1],sizeof(BYTE),1,file);j=3;
}
else if(j==3)
{
fwrite(&a[l],sizeof(char),1,file);
l++;
if(l==len)
{
j=0;
}
}
else
fwrite(&pos[i],sizeof(BYTE),1,file);
}
fclose(file);
fclose(file1);
}
void midhidejpg1()//数据区隐写提取
{
long int size=0;
HANDLE hfile = CreateFileA("5_2.jpg", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0);
if(hfile!=INVALID_HANDLE_VALUE)
{
size=GetFileSize(hfile,NULL);
CloseHandle(hfile);
}
FILE* fid;
fopen_s(&fid,"5_2.midhide.jpg","rb");
int biaozhi[4]={109,109};
rewind(fid);
BYTE *pos = (BYTE*) malloc (sizeof(BYTE)*size);
fread(pos,sizeof(BYTE),size,fid);
cout<<"隐写数据为:"<<endl;
int j=0,k=0,size1=0;
for(int i=0;i<size;i++)
{
if(pos[i]==255&&pos[i+1]==218) //FFDA
{ j=1;k=pos[i+3]+i+1;}
if(j==1&&i>=k)
{ if(pos[i]==109&&pos[i+1]==109)//标记MM
j==2;}
if(j==2&&size<8)
{ size1++;cout<<pos[i];}
cout<<endl;
}
fclose(fid);
}
int _tmain(int argc, _TCHAR* argv[])
{
headhidejpg();//头隐写
headhidejpg1();
midhidejpg();//数据隐写
midhidejpg1();
hide3jpg();//尾部隐写
hide3jpg1();
return 0;
}