1/1页1 跳转到查看:434
发新话题 回复该主题

在AVI文件中隐藏信息

在AVI文件中隐藏信息

Windows AVI 库是avifil32.dll中函数的集合. 使用之前先得用 AVIFileInit初始化. AVIFileOpen 打开文件, AVIFileGetStream 取得视频流. 这些函数申请的内存最后都必须释放. AVI文件可以包含四种不同类型的多个流,通常每种类型只有一个流,我们这里只关心视频流.k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Initialize the AVI libraryk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern void AVIFileInit();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Open an AVI filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll", PreserveSig=true)]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIFileOpen(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref int ppfile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
String szFile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int uMode,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pclsidHandler);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get a stream from an open AVI filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIFileGetStream(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pfile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
out IntPtr ppavi,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int fccType,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int lParam);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Release an open AVI streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamRelease(IntPtr aviStream);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Release an ope AVI filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIFileRelease(int pfile);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Close the AVI libraryk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern void AVIFileExit();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
private int aviFile = 0;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
private IntPtr aviStream;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public void Open(string fileName) {k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
AVIFileInit(); //Intitialize AVI libraryk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Open the filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int result = AVIFileOpen(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref aviFile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
fileName,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
OF_SHARE_DENY_WRITE, 0);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get the video streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
result = AVIFileGetStream(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
aviFile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
out aviStream,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
streamtypeVIDEO, 0);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
追随理想和美人而生活!

TOP

 

回复: 在AVI文件中隐藏信息

读帧之前,我们需要明了我们要读的东西: 第一个帧从哪里开始的?一共有多少帧?图像的高度宽度是多少?AVI库包含以下函数回答我们的上述问题k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get the start position of a streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll", PreserveSig=true)]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamStart(int pavi);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get the length of a stream in framesk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll", PreserveSig=true)]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamLength(int pavi);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get header information about an open streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamInfo(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pAVIStream,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref AVISTREAMINFO psi,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int lSize);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
  调用以上函数我们可以填充位图信息头BITMAPINFOHEADER 结构,然后我们用以下函数来提取帧k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get a pointer to a GETFRAME object (returns 0 on error)k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamGetFrameOpen(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
IntPtr pAVIStream,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref BITMAPINFOHEADER bih);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Get a pointer to a packed DIB (returns 0 on error)k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamGetFrame(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pGetFrameObj,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int lPos);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Release the GETFRAME objectk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamGetFrameClose(int pGetFrameObj);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
  准备工作就绪,现在解压帧k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//get start position and count of framesk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int firstFrame = AVIStreamStart(aviStream.ToInt32());k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int countFrames = AVIStreamLength(aviStream.ToInt32());k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//get header informationk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
AVISTREAMINFO streamInfo = new AVISTREAMINFO();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
result = AVIStreamInfo(aviStream.ToInt32(), ref streamInfo,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
Marshal.SizeOf(streamInfo));k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//construct the expected bitmap headerk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
BITMAPINFOHEADER bih = new BITMAPINFOHEADER();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biBitCount = 24;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biCompression = 0; //BI_RGB;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biHeight = (Int32)streamInfo.rcFrame.bottom;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biWidth = (Int32)streamInfo.rcFrame.right;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biPlanes = 1;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.biSize = (UInt32)Marshal.SizeOf(bih);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//prepare to decompress DIBs (device independend bitmaps)k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int getFrameObject = AVIStreamGetFrameOpen(aviStream, ref bih);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Export the frame at the specified positionk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public void ExportBitmap(int position, String dstFileName){k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Decompress the frame and return a pointer to the DIBk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pDib = Avi.AVIStreamGetFrame(getFrameObject, firstFrame + position);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Copy the bitmap header into a managed structk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
BITMAPINFOHEADER bih = new BITMAPINFOHEADER();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih = (BITMAPINFOHEADER)Marshal.PtrToStructure(new IntPtr(pDib),k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bih.GetType());k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Copy the imagek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
byte[] bitmapData = new byte[bih.biSizeImage];k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int address = pDib + Marshal.SizeOf(bih);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
for(int offset=0; offset<bitmapData.Length; offset++){k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bitmapData[offset] = Marshal.ReadByte(new IntPtr(address));k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
address++;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Copy bitmap infok€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
byte[] bitmapInfo = new byte[Marshal.SizeOf(bih)];k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
IntPtr ptr;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ptr = Marshal.AllocHGlobal(bitmapInfo.Length);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
Marshal.StructureToPtr(bih, ptr, false);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
address = ptr.ToInt32();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
for(int offset=0; offset<bitmapInfo.Length; offset++){k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bitmapInfo[offset] = Marshal.ReadByte(new IntPtr(address));k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
address++;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
追随理想和美人而生活!

TOP

 

回复: 在AVI文件中隐藏信息

然后保存为位图k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Create file headerk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
Avi.BITMAPFILEHEADER bfh = new Avi.BITMAPFILEHEADER();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bfh.bfType = Avi.BMP_MAGIC_COOKIE;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//size of file as written to diskk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bfh.bfSize = (Int32)(55 + bih.biSizeImage);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bfh.bfOffBits = Marshal.SizeOf(bih) + Marshal.SizeOf(bfh);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Create or overwrite the destination filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
FileStream fs = new FileStream(dstFileName, System.IO.FileMode.Create);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
BinaryWriter bw = new BinaryWriter(fs);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Write headerk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bfh.bfType);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bfh.bfSize);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bfh.bfReserved1);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bfh.bfReserved2);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bfh.bfOffBits);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Write bitmap infok€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bitmapInfo);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Write bitmap datak€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Write(bitmapData);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bw.Close();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
fs.Close();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
} //end of ExportBitmapk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
  应用程序会把解出来的位图当作普通位图来隐藏信息,如果载体文件是AVI文件,则提取第一帧到一个临时位图文件,放入一些信息,接下来是第二帧...最后一帧之后则关闭AVI文件,删除临时位图文件,接下来处理下一个载体文件.k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
  应用程序块打开AVI 载体文件时, 它创建另一个AVI文件来保存新的位图,新的文件大小和帧频率都与原来的一样, 我们不能用 Open() 来创建,而使用AVIFileCreateStream, AVIStreamSetFormat and AVIStreamWrite:k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Create a new stream in an open AVI filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIFileCreateStream(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int pfile,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
out IntPtr ppavi,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref AVISTREAMINFO ptr_streaminfo);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Set the format for a new streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamSetFormat(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
IntPtr aviStream, Int32 lPos,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref BITMAPINFOHEADER lpFormat, Int32 cbFormat);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Write a sample to a streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[DllImport("avifil32.dll")]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public static extern int AVIStreamWrite(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
IntPtr aviStream, Int32 lStart, Int32 lSamples,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
IntPtr lpBuffer, Int32 cbBuffer, Int32 dwFlags,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
Int32 dummy1, Int32 dummy2);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
追随理想和美人而生活!

TOP

 

回复: 在AVI文件中隐藏信息

现在创建视频流:k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Create a new video streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
private void CreateStream() {k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//describe the stream to createk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
AVISTREAMINFO strhdr = new AVISTREAMINFO();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.fccType = this.fccType; //mmioStringToFOURCC("vids", 0)k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.fccHandler = this.fccHandler; //"Microsoft Video 1"k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.dwScale = 1;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.dwRate = frameRate;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.dwSuggestedBufferSize = (UInt32)(height * stride);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//use highest quality! Compression destroys the hidden message.k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.dwQuality = 10000;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.rcFrame.bottom = (UInt32)height;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.rcFrame.right = (UInt32)width;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
strhdr.szName = new UInt16[64];k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//create the streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int result = AVIFileCreateStream(aviFile, out aviStream, ref strhdr);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//define the image formatk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
BITMAPINFOHEADER bi = new BITMAPINFOHEADER();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biSize = (UInt32)Marshal.SizeOf(bi);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biWidth = (Int32)width;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biHeight = (Int32)height;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biPlanes = 1;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biBitCount = 24;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bi.biSizeImage = (UInt32)(this.stride * this.height);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//format the streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
result = Avi.AVIStreamSetFormat(aviStream, 0, ref bi, Marshal.SizeOf(bi));k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
  写入帧:k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Create an empty AVI filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public void Open(string fileName, UInt32 frameRate) {k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
this.frameRate = frameRate;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
Avi.AVIFileInit();k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int hr = Avi.AVIFileOpen(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ref aviFile, fileName,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
OF_WRITE | OF_CREATE, 0);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//Add a sample to the stream - for first sample: create the streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public void AddFrame(Bitmap bmp) {k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
BitmapData bmpDat = bmp.LockBits(k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
new Rectangle(0, 0, bmp.Width, bmp.Height),k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
ImageLockMode.ReadOnly,PixelFormat.Format24bppRgb);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//this is the first frame - get size and create a new streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
if (this.countFrames == 0) {k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
this.stride = (UInt32)bmpDat.Stride;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
this.width = bmp.Width;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
this.height = bmp.Height;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
CreateStream(); //a method to create a new video streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//add the bitmap to the streamk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
int result = AVIStreamWrite(aviStream,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
countFrames, 1,k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bmpDat.Scan0, //pointer to the beginning of the image datak€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
(Int32) (stride * height),k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
0, 0, 0);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bmp.UnlockBits(bmpDat);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
this.countFrames ++;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
[代码中CryptUtility类的改变]k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
HideOrExtract() 在前面的版本中一次读入所有载体位图,但现在必须改进了,每次加在一个位图,在加载下一个位图前先释放本位图.当前使用的位图(一个简单的位图或者AVI的一帧)保存在BitmapInfo结构中,通过by ref方式传递k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public struct BitmapInfo{k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//uncompressed imagek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public Bitmap bitmap;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//position of the frame in the AVI stream, -1 for non-avi bitmapsk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public int aviPosition;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//count of frames in the AVI stream, or 0 for non-avi bitmapsk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public int aviCountFrames;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//path and name of the bitmap filek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//this file will be deleted later, if aviPosition is 0 or greaterk€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public String sourceFileName;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
//how many bytes will be hidden in this imagek€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public long messageBytesToHide;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
public void LoadBitmap(String fileName){k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
bitmap = new Bitmap(fileName);k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
sourceFileName = fileName;k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
}k€#ñ/.Ôforum.entlib.net.cnBoùXeüR˜
追随理想和美人而生活!

TOP

 
1/1页1 跳转到
发表新主题 回复该主题