标题:读取24位黑白BMP图片信息转换为字符画的问题
取消只看楼主
无所谓想
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-1-25
结帖率:0
 问题点数:0 回复次数:1 
读取24位黑白BMP图片信息转换为字符画的问题
程序代码:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#pragma pack(2)
/*定义WORD为两个字节的类型*/
typedef unsigned short WORD;
/*定义DWORD为e四个字节的类型*/
typedef unsigned long DWORD;

struct image
{
char data[4000];
};

struct image * p[1200];

typedef struct BMP_FILE_HEADER
{
    WORD bType;             /*  文件标识符          */
    DWORD bSize;            /*  文件的大小          */
    WORD bReserved1;        /*  保留值,必须设置为0  */      
    WORD bReserved2;        /*  保留值,必须设置为0  */
    DWORD bOffset;          /*  文件头的最后到图像数据位开始的偏移量    */
} BMPFILEHEADER;

typedef struct BMP_INFO
{
    DWORD bInfoSize;       /*  信息头的大小             */
    DWORD bWidth;          /*  图像的宽度               */
    DWORD bHeight;         /*  图像的高度               */
    WORD bPlanes;          /*  图像的位面数             */
    WORD bBitCount;        /*  每个像素的位数           */
    DWORD bCompression;    /*  压缩类型                 */
    DWORD bmpImageSize;    /*  图像的大小,以字节为单位  */
    DWORD bXPelsPerMeter;  /*  水平分辨率               */
    DWORD bYPelsPerMeter;  /*  垂直分辨率               */
    DWORD bClrUsed;        /*  使用的色彩数             */
    DWORD bClrImportant;   /*  重要的颜色数             */
} BMPINF;


typedef struct RGB_QUAD
{
    WORD rgbBlue;         /*  蓝色强度  */
    WORD rgbGreen;        /*  绿色强度  */
    WORD rgbRed;          /*  红色强度  */
    WORD rgbReversed;     /*  保留值    */
} RGBQUAD;

int main()
{
    int num=0;
    char address[100];
    char name[100];
    BMPFILEHEADER fileHeader;
    BMPINF infoHeader;
    long width,height;
    FILE * final;
    FILE *fp,* memry;
    int pix[3];
    int rwidth=0,middle=0;
    long offset, bmpImageSize, bytesPerPixel, size, bitCount;
   
    while(1)
   {
    if(num==6566)break;
    sprintf(address,"e:\\BMP2\\s150_pt%d.bmp",num);
    sprintf(name,"e:\\mem\\pt%d.txt",num);
    num++;
    memry = fopen("e:\\time\\T.txt", "w+");
    final = fopen(name,"w+");
//    int i, j;
//    unsigned char **p;
    WORD c;
    if((fp = fopen(address, "rb")) == NULL)
    {
        printf("Cann't open the file!\n");
        exit(0);
    }

    fseek(fp, 0, 0);
    fread(&fileHeader, sizeof(fileHeader), 1, fp);
    fread(&infoHeader, sizeof(infoHeader), 1, fp);

    //计算并输出位图数据的偏移量,图像的大小,宽度和高度,每个像素点所占的字节
    size = fileHeader.bSize;
    offset = fileHeader.bOffset;
    bmpImageSize = infoHeader.bmpImageSize;
    width = infoHeader.bWidth;
    height = infoHeader.bHeight;
    bitCount = infoHeader.bBitCount;
    bytesPerPixel = infoHeader.bBitCount / 8;
   
    printf("第%d个文件转换完成!",num);

    //输出每个像素点所占字节中的内容
    pix[0] = fgetc(fp);
    pix[1] = fgetc(fp);
    pix[2] = fgetc(fp);
    while (!feof(fp))
    {
        if(pix[0]<=10&&pix[1]<=10&&pix[2]<=10)
        {
        fputc('@',memry);
        }
        if(pix[0]>=200&&pix[1]>=200&&pix[2]>=200)
        {
        fputc(' ',memry);
        }
        rwidth++;
        if(rwidth==width)
        {
        fputc('\n',memry);
        rwidth=0;
        }
        pix[0] = fgetc(fp);
        pix[1] = fgetc(fp);
        pix[2] = fgetc(fp);
    }
    fclose(fp);
    fseek(memry, 0, 0);
    for(middle=1;middle<=height;middle++)
    {
    p[middle]=(struct image *)malloc(sizeof(struct image));
    fgets(p[middle]->data,4000,memry);
    }
    middle--;
    for(;middle>0;middle--)
    {
    fputs(p[middle]->data,final);
    free(p[middle]);
    }
   rwidth=0;
   fclose(final);
   fclose(memry);
   }
   system("pause");
    return 0;
}
在读取大图的时候没有问题,但是一旦读取小图,就会产生错位现象,并且效果极差
搜索更多相关主题的帖子: color 图片 黑白 
2012-01-27 16:30
无所谓想
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2012-1-25
得分:0 
前面结构定义和尺寸读取的部分是从网上COPY的,,
2012-01-27 16:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-360049-1-1.html




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

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