| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2080 人关注过本帖
标题:图片隐藏,生成的图片只有下半张,求问哪里出错了
只看楼主 加入收藏
幽蓝小巫
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2017-12-19
结帖率:0
收藏
已结贴  问题点数:20 回复次数:11 
图片隐藏,生成的图片只有下半张,求问哪里出错了
/*
将一张图片隐藏到另一张图片中
载体图为灰度图
blog:http://
2015年6月3日17:59:34
*/
#include<stdio.h>
#include<malloc.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;
#pragma pack()
/*
位图数据信息结构
*/
#pragma pack(1)
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;
#pragma pack()
/*
调色板结构
*/
#pragma pack(1)
typedef struct tagRGBQUAD
{
    unsigned char rgbBlue; //蓝色分量亮度
    unsigned char rgbGreen;//绿色分量亮度
    unsigned char rgbRed;//红色分量亮度
    unsigned char rgbReserved;
}rgbq;
#pragma pack()

int main()
{
    FILE * fpCov, *fpSec, *fpSte;
    int i, j;
    unsigned char ImgData[300][300];
    unsigned char ImgData2[300][300];

    fileHeader * fh, *fh2;
    fileInfo * fi, *fi2;
    rgbq * fq, *fq2;
    if ((fpCov = fopen("D:/yincang/1.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }

    if ((fpSec = fopen("D:/yincang/2.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }
    if ((fpSte = fopen("D:/yincang/123.bmp", "wb")) == NULL)
    {
        printf("创建文件失败");
        exit(0);
    }
    /*
    读取载体图片
    */
    fh = (fileHeader *)malloc(sizeof(fileHeader));
    fi = (fileInfo *)malloc(sizeof(fileInfo));
    fq = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh, sizeof(fileHeader), 1, fpCov);
    fread(fi, sizeof(fileInfo), 1, fpCov);
    fread(fq, sizeof(rgbq), 256, fpCov);

    for (i = 0; i<fi->biHeight; i++)
    {
        for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
            fread(&ImgData[i][j], 1, 1, fpCov);
    }
    /*读取秘密图片*/
    fh2 = (fileHeader *)malloc(sizeof(fileHeader));
    fi2 = (fileInfo *)malloc(sizeof(fileInfo));
    fq2 = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh2, sizeof(fileHeader), 1, fpSec);
    fread(fi2, sizeof(fileInfo), 1, fpSec);
    fread(fq2, sizeof(rgbq), 256, fpSec);

    for (i = 0; i<fi->biHeight; i++)
    {
        for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
            fread(&ImgData2[i][j], 1, 1, fpSec);
    }
    /*隐藏图片*/
    for (i = 0; i<fi->biHeight; i++)
    {
        for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
        {
            /*将载体图片低四位置零*/
            ImgData[i][j] = ImgData[i][j] & 240;
            /*将秘密图片低四位置零*/
            ImgData2[i][j] = ImgData2[i][j] & 240;
            /*将秘密图片高四位移到低四位*/
            ImgData2[i][j] = ImgData2[i][j] >> 4;
            /*将秘密图片隐藏到载体图片中*/
            ImgData[i][j] = ImgData[i][j] + ImgData2[i][j];
        }
    }
    /*将图片数据写入*/
    fwrite(fh, sizeof(fileHeader), 1, fpSte);
    fwrite(fi, sizeof(fileInfo), 1, fpSte);
    fwrite(fq, sizeof(rgbq), 256, fpSte);
    for (i = 0; i<fi->biHeight;i++)
    {
        for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
            fwrite(&ImgData[i][j], 1, 1, fpSte);
    }

    free(fh);
    free(fi);
    free(fq);
    fclose(fpCov);
    fclose(fpSec);
    fclose(fpSte);
    printf("success\n");
    return 0;
}


[此贴子已经被作者于2017-12-19 22:55编辑过]

搜索更多相关主题的帖子: 图片 unsigned long sizeof fread 
2017-12-19 22:53
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:10 
这个需要JPEG的文件格式 bmp的文件格式 等等

DO IT YOURSELF !
2017-12-20 08:48
幽蓝小巫
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2017-12-19
收藏
得分:0 
回复 2楼 wp231957
所有图片均为256*256 bmp ,输出图片只显示三分之一。
2017-12-20 14:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:10 
调色板是32位
256*256 每行字节对齐而添加的字节数为0
读图像数据:biHeight和biWidth为256,每行为biWidth*4=1024字节
    for (i = 0; i<fi->biHeight; i++)
    {
        for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
改为:
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<1024; j++)

2017-12-20 15:46
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
1.bmp和2.bmp应为32位256*256的BMP文件
2017-12-20 15:48
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
还有这两个:
    unsigned char ImgData[256][1024];
    unsigned char ImgData2[256][1024];
2017-12-20 15:58
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
简单改了一下,如果是固定格式的BMP还可以优化。
/*
将一张图片隐藏到另一张图片中
载体图为灰度图
blog:http://
2015年6月3日17:59:34
*/
#include<stdio.h>
#include<malloc.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;
#pragma pack()
/*
位图数据信息结构
*/
#pragma pack(1)
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;
#pragma pack()
/*
调色板结构
*/
#pragma pack(1)
typedef struct tagRGBQUAD
{
    unsigned char rgbBlue; //蓝色分量亮度
    unsigned char rgbGreen;//绿色分量亮度
    unsigned char rgbRed;//红色分量亮度
    unsigned char rgbReserved;
} rgbq;
#pragma pack()

int main()
{
    FILE * fpCov, *fpSec, *fpSte;
    int i, j;
    //unsigned char ImgData[300][300];
    //unsigned char ImgData2[300][300];
    unsigned char ImgData[256][1024];
    unsigned char ImgData2[256][1024];

    fileHeader * fh, *fh2;
    fileInfo * fi, *fi2;
    rgbq * fq, *fq2;
    //if ((fpCov = fopen("D:/yincang/1.bmp", "rb")) == NULL)
    if ((fpCov = fopen("1.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }

    //if ((fpSec = fopen("D:/yincang/2.bmp", "rb")) == NULL)
    if ((fpSec = fopen("2.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }
    //if ((fpSte = fopen("D:/yincang/123.bmp", "wb")) == NULL)
    if ((fpSte = fopen("123.bmp", "wb")) == NULL)
    {
        printf("创建文件失败");
        exit(0);
    }
    /*
    读取载体图片
    */
    fh = (fileHeader *)malloc(sizeof(fileHeader));
    fi = (fileInfo *)malloc(sizeof(fileInfo));
    fq = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh, sizeof(fileHeader), 1, fpCov);
    fread(fi, sizeof(fileInfo), 1, fpCov);
    fread(fq, sizeof(rgbq), 256, fpCov);

    if (fi->biBitCount!=32 || fi->biWidth!=256 || fi->biHeight!=256)
    {
        printf("文件格式不符,要求32位256*256的BMP文件");
        exit(0);
    }

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<1024; j++)
            fread(&ImgData[i][j], 1, 1, fpCov);
    }
    /*读取秘密图片*/
    fh2 = (fileHeader *)malloc(sizeof(fileHeader));
    fi2 = (fileInfo *)malloc(sizeof(fileInfo));
    fq2 = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh2, sizeof(fileHeader), 1, fpSec);
    fread(fi2, sizeof(fileInfo), 1, fpSec);
    fread(fq2, sizeof(rgbq), 256, fpSec);

    if (fi2->biBitCount!=32 || fi2->biWidth!=256 || fi2->biHeight!=256)
    {
        printf("文件格式不符,要求32位256*256的BMP文件");
        exit(0);
    }

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<1024; j++)
            fread(&ImgData2[i][j], 1, 1, fpSec);
    }
    /*隐藏图片*/
    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<1024; j++)
        {
            /*将载体图片低四位置零*/
            ImgData[i][j] = ImgData[i][j] & 240;
            /*将秘密图片低四位置零*/
            ImgData2[i][j] = ImgData2[i][j] & 240;
            /*将秘密图片高四位移到低四位*/
            ImgData2[i][j] = ImgData2[i][j] >> 4;
            /*将秘密图片隐藏到载体图片中*/
            ImgData[i][j] = ImgData[i][j] + ImgData2[i][j];
        }
    }
    /*将图片数据写入*/
    fwrite(fh, sizeof(fileHeader), 1, fpSte);
    fwrite(fi, sizeof(fileInfo), 1, fpSte);
    fwrite(fq, sizeof(rgbq), 256, fpSte);

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<1024; j++)
            fwrite(&ImgData[i][j], 1, 1, fpSte);
    }

    free(fh);
    free(fi);
    free(fq);
    fclose(fpCov);
    fclose(fpSec);
    fclose(fpSte);
    printf("success\n");
    return 0;
}



[此贴子已经被作者于2017-12-20 16:21编辑过]

2017-12-20 16:17
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
看漏了一点:
fread(fq, sizeof(rgbq), 256, fpCov);
颜色表是256个表项,应该是8位的BMP文件。
最好提供示例文件方便测试。
2017-12-20 16:34
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10568
专家分:43031
注 册:2014-5-20
收藏
得分:0 
/*
将一张图片隐藏到另一张图片中
载体图为灰度图
blog:http://
2015年6月3日17:59:34
*/
#include<stdio.h>
#include<malloc.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;
#pragma pack()
/*
位图数据信息结构
*/
#pragma pack(1)
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;
#pragma pack()
/*
调色板结构
*/
#pragma pack(1)
typedef struct tagRGBQUAD
{
    unsigned char rgbBlue; //蓝色分量亮度
    unsigned char rgbGreen;//绿色分量亮度
    unsigned char rgbRed;//红色分量亮度
    unsigned char rgbReserved;
} rgbq;
#pragma pack()

int main()
{
    FILE * fpCov, *fpSec, *fpSte;
    int i, j;
    //unsigned char ImgData[300][300];
    //unsigned char ImgData2[300][300];
    unsigned char ImgData[256][256];
    unsigned char ImgData2[256][256];

    fileHeader * fh, *fh2;
    fileInfo * fi, *fi2;
    rgbq * fq, *fq2;
    //if ((fpCov = fopen("D:/yincang/1.bmp", "rb")) == NULL)
    if ((fpCov = fopen("1.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }

    //if ((fpSec = fopen("D:/yincang/2.bmp", "rb")) == NULL)
    if ((fpSec = fopen("2.bmp", "rb")) == NULL)
    {
        printf("打开文件失败");
        exit(0);
    }
    //if ((fpSte = fopen("D:/yincang/123.bmp", "wb")) == NULL)
    if ((fpSte = fopen("123.bmp", "wb")) == NULL)
    {
        printf("创建文件失败");
        exit(0);
    }
    /*
    读取载体图片
    */
    fh = (fileHeader *)malloc(sizeof(fileHeader));
    fi = (fileInfo *)malloc(sizeof(fileInfo));
    fq = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh, sizeof(fileHeader), 1, fpCov);
    fread(fi, sizeof(fileInfo), 1, fpCov);
    fread(fq, sizeof(rgbq), 256, fpCov);

    if (fi->biBitCount!=8 || fi->biWidth!=256 || fi->biHeight!=256)
    {
        printf("文件格式不符,要求8位256*256的BMP文件");
        exit(0);
    }

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<256; j++)
            fread(&ImgData[i][j], 1, 1, fpCov);
    }
    /*读取秘密图片*/
    fh2 = (fileHeader *)malloc(sizeof(fileHeader));
    fi2 = (fileInfo *)malloc(sizeof(fileInfo));
    fq2 = (rgbq *)malloc(sizeof(rgbq) * 256);
    fread(fh2, sizeof(fileHeader), 1, fpSec);
    fread(fi2, sizeof(fileInfo), 1, fpSec);
    fread(fq2, sizeof(rgbq), 256, fpSec);

    if (fi2->biBitCount!=8 || fi2->biWidth!=256 || fi2->biHeight!=256)
    {
        printf("文件格式不符,要求8位256*256的BMP文件");
        exit(0);
    }

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<256; j++)
            fread(&ImgData2[i][j], 1, 1, fpSec);
    }
    /*隐藏图片*/
    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<256; j++)
        {
            /*将载体图片低四位置零*/
            ImgData[i][j] = ImgData[i][j] & 240;
            /*将秘密图片低四位置零*/
            ImgData2[i][j] = ImgData2[i][j] & 240;
            /*将秘密图片高四位移到低四位*/
            ImgData2[i][j] = ImgData2[i][j] >> 4;
            /*将秘密图片隐藏到载体图片中*/
            ImgData[i][j] = ImgData[i][j] + ImgData2[i][j];
        }
    }
    /*将图片数据写入*/
    fwrite(fh, sizeof(fileHeader), 1, fpSte);
    fwrite(fi, sizeof(fileInfo), 1, fpSte);
    fwrite(fq, sizeof(rgbq), 256, fpSte);

    //for (i = 0; i<fi->biHeight; i++)
    //{
    //    for (j = 0; j<(fi->biWidth + 3) / 4 * 4; j++)
    for (i = 0; i<256; i++)
    {
        for (j = 0; j<256; j++)
            fwrite(&ImgData[i][j], 1, 1, fpSte);
    }

    free(fh);
    free(fi);
    free(fq);
    fclose(fpCov);
    fclose(fpSec);
    fclose(fpSte);
    printf("success\n");
    return 0;
}
2017-12-20 16:45
幽蓝小巫
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2017-12-19
收藏
得分:0 
回复 9楼 吹水佬
谢谢大佬回复,这个论坛不让发BMP图。https:// 这是代码来源,里面有图,不过下下来是JPG,需要转为BMP。大佬有兴趣可以测试下。我按您的代码试了下,没有成功。输出图片文件还是不能打开,应该是转为BMP格式时,参数有问题。询问下是应该选256*256 8位 对吗?

[此贴子已经被作者于2017-12-20 17:21编辑过]

2017-12-20 17:07
快速回复:图片隐藏,生成的图片只有下半张,求问哪里出错了
数据加载中...
 
   



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

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