| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2057 人关注过本帖
标题:图片隐藏,生成的图片只有下半张,求问哪里出错了
只看楼主 加入收藏
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10541
专家分:42927
注 册:2014-5-20
收藏
得分:0 
回复 10楼 幽蓝小巫
看了一下,是8位256*256格式。
转为bmp后用9楼的代码可以执行,还没试过还原。
BMP文件:
bmp.rar (74.2 KB)

2017-12-20 20:59
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10541
专家分:42927
注 册:2014-5-20
收藏
得分:0 
固定用8位256*256格式可以简化点:
#include<stdio.h>
#include<stdlib.h>
/*
位图头结构
*/
#pragma pack(1)
typedef struct tagBITMAPFILEHEADER
{
    unsigned char bfType[2];//文件格式
    unsigned long bfSize;//文件大小
    unsigned short bfReserved1;//保留
    unsigned short bfReserved2;
    unsigned long bfOffBits; //DIB数据在文件中的偏移量
} fileHeader;
/*
位图数据信息结构
*/
typedef struct tagBITMAPINFOHEADER
{
    unsigned long biSize;//该结构的大小
    long biWidth;//文件宽度
    long biHeight;//文件高度
    unsigned short biPlanes;//平面数
    unsigned short biBitCount;//颜色位数
    unsigned long biCompression;//压缩类型
    unsigned long biSizeImage;//DIB数据区大小
    long biXPixPerMeter;
    long biYPixPerMeter;
    unsigned long biClrUsed;//多少颜色索引表
    unsigned long biClrImporant;//多少重要颜色
} fileInfo;
/*
调色板结构
*/
typedef struct tagRGBQUAD
{
    unsigned char rgbBlue; //蓝色分量亮度
    unsigned char rgbGreen;//绿色分量亮度
    unsigned char rgbRed;//红色分量亮度
    unsigned char rgbReserved;
} rgbq;

typedef struct tagBITMAPINFO
{
    fileHeader head;
    fileInfo info;
    rgbq rgb[256];
} bmpInfo;

#pragma pack()

FILE *_fopen(char *path, char *mode)
{
    FILE *fp;
    if ((fp=fopen(path,mode)) == NULL)
    {
        printf("打开文件失败, %s\n", path);
        exit(0);
    }
    return fp;
}

unsigned char *_read(FILE *fp)
{
    int fSize = sizeof(bmpInfo)+256*256;
    unsigned char *buf = (unsigned char *)malloc(fSize);
    if (buf == NULL)
    {
        printf("分配内存失败\n");
        exit(0);
    }
    fread(buf, fSize, 1, fp);
    return buf;
}

void _hide(char *fCov, char *fSec, char *fSte)
{
    FILE *fpCov = _fopen(fCov,"rb");
    FILE *fpSec = _fopen(fSec,"rb");
    FILE *fpSte = _fopen(fSte,"wb");
    unsigned char *CovBuf = _read(fpCov);
    unsigned char *SecBuf = _read(fpSec);
    bmpInfo *biCov = (bmpInfo *)CovBuf;
    bmpInfo *biSec = (bmpInfo *)SecBuf;
    if (biCov->info.biBitCount!=8 || biCov->info.biWidth!=256 || biCov->info.biHeight!=256 ||
            biSec->info.biBitCount!=8 || biSec->info.biWidth!=256 || biSec->info.biHeight!=256)
    {
        printf("文件格式不符,要求8位256*256的BMP文件");
        exit(0);
    }
    unsigned char *pCov = CovBuf + sizeof(bmpInfo);
    unsigned char *pSec = SecBuf + sizeof(bmpInfo);
    int i;
    for (i=0; i<256*256; ++i,++pCov,++pSec)
        *pCov = (*pCov&0xF0)|(*pSec>>4);
    fwrite(CovBuf, sizeof(bmpInfo)+256*256, 1, fpSte);
    free(CovBuf);
    free(SecBuf);
    fclose(fpCov);
    fclose(fpSec);
    fclose(fpSte);
}

void _show(char *fCov, char *fSte)
{
    FILE *fpCov = _fopen(fCov,"rb");
    FILE *fpSte = _fopen(fSte,"wb");
    unsigned char *CovBuf = _read(fpCov);
    bmpInfo *biCov = (bmpInfo *)CovBuf;
    if (biCov->info.biBitCount!=8 || biCov->info.biWidth!=256 || biCov->info.biHeight!=256)
    {
        printf("文件格式不符,要求8位256*256的BMP文件");
        exit(0);
    }
    unsigned char *pCov = CovBuf + sizeof(bmpInfo);
    int i;
    for (i=0; i<256*256; ++i,++pCov)
        *pCov = *pCov<<4;
    fwrite(CovBuf, sizeof(bmpInfo)+256*256, 1, fpSte);
    free(CovBuf);
    fclose(fpCov);
    fclose(fpSte);
}

int main()
{
    _hide("1.bmp", "2.bmp", "123.bmp");
    _show("123.bmp", "321.bmp");
    printf("success\n");
    return 0;
}
2017-12-21 11:48
快速回复:图片隐藏,生成的图片只有下半张,求问哪里出错了
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017770 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved