标题:我要用C语言调用输出一个jpg格式的图片,那位大师写个源程序给我看看,不胜 ...
只看楼主
亚洲飞鹰
Rank: 2
等 级:论坛游民
帖 子:35
专家分:17
注 册:2010-6-1
结帖率:57.14%
已结贴  问题点数:20 回复次数:15 
我要用C语言调用输出一个jpg格式的图片,那位大师写个源程序给我看看,不胜感激啊
我要用C语言调用输出一个jpg格式的图片,那位大师写个源程序给我看看,不胜感激啊
搜索更多相关主题的帖子: C语言 大师 jpg 格式 
2010-06-15 17:16
hangeng
Rank: 2
等 级:论坛游民
帖 子:424
专家分:39
注 册:2007-7-23
得分:2 
好像 很难

  雨水冲不进窗来,在玻璃上痛哭。但它至少奋斗过。
2010-06-15 22:02
亚洲飞鹰
Rank: 2
等 级:论坛游民
帖 子:35
专家分:17
注 册:2010-6-1
得分:0 
是啊,我们老师叫我用C编一个班级通讯录,要能输出照片,哪位高人,帮帮忙哦,不甚感激。
2010-06-15 23:01
???Cc丶?
Rank: 2
等 级:等待验证会员
帖 子:13
专家分:23
注 册:2010-6-16
得分:2 
我现在还没学到这里来- -|
2010-06-16 19:23
亚洲飞鹰
Rank: 2
等 级:论坛游民
帖 子:35
专家分:17
注 册:2010-6-1
得分:0 
有能力的大师们,小生在这里求你们帮忙啦!先谢谢你们
2010-06-16 22:31
isdragon
Rank: 1
等 级:新手上路
帖 子:3
专家分:2
注 册:2010-6-16
得分:2 
JPG是压缩格式,我不会,我只会BMP的,
之前刚好完成课程设计做了一份
#include "stdlib.h"
#include "graphics.h"
#include "stdio.h"

#define WIDTH 120
#define HEIGHT 120
用一个二维数组保存的图片,这里图片长高必须是4的倍数,不是4的倍数必须进行补齐,但是这里面是没有进行补位操作的,你也可以自己去看看24位bmp图片的编码格式,然后就知道该怎么用了
void mian()
{
    FILE *fp;
    unsigned char bmp[16][200];
    unsigned char bmp2[WIDTH][HEIGHT*3];
    int i = 1,size1 = 0,size2 = 0,size0 = 0;
    int j = 0;
    if((fp = fopen("G:\\new\\Boy5.bmp","rb")) == NULL)//打开图片
        exit(0);
    i = 0;
    fseek(fp,54L,0);//BMP图片阵列是从第54位开始
//#########读入图片阵列到数组中##########
    while(i < WIDTH*HEIGHT*3)
    {
        *(bmp2[0]+i) = fgetc(fp);
        i++;
    }
    fclose(fp);
    initgraph(700, 700);    // 打开图形窗口,这里这个函数我之前是在VC下编译的,用了一个网上的绘图库,与TC的打开图形界面函数有所差别,改掉就可以了
    //####################################输出图片,这里是打点的方式在图形界面输出,   
    for(i = 0;i < (WIDTH-1);)
    {
        for(j =0;j < (HEIGHT-1)*3 ;)
        {
            putpixel(50+(j/3),600-(i/1),RGB((int)bmp2[i][j+2],(int)bmp2[i][j+3],(int)bmp2[i][j+4]));//输出像素点
            j+=3;
        }
        i++;
    }
    getchar();
    closegraph();    // 关闭图形窗口
}

[ 本帖最后由 isdragon 于 2010-6-16 23:08 编辑 ]
2010-06-16 23:06
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
得分:0 
不应该直接打点来显示图片,这样效率不是一般的低,而且不能处理非24位真彩色的图片,而应该用CreateDIBitmap,这个函数可以处理2色,16色,256色,等各种规格的图片,因为图片的数据量是非常大的,还有当在程序中定义数组的时候是在栈分配空间的,而栈的大小是有严格规定的(可以修改),一般不超过2M,所以可能出现分配失败,最好在堆里申请.再着,没有4对齐对于宽度不是4的倍数的图片在显示图片会出现图片倾斜的情况.

[ 本帖最后由 faminxmu 于 2010-6-17 10:35 编辑 ]

在虚拟的世界中寻找目标。
2010-06-17 10:32
亚洲飞鹰
Rank: 2
等 级:论坛游民
帖 子:35
专家分:17
注 册:2010-6-1
得分:0 
楼上这位高人能不能写个具体的程序让我看看啊,小生C语言学的还没有到那种深度啊 ,拜托了
2010-06-17 11:48
faminxmu
Rank: 3Rank: 3
来 自:厦门
等 级:论坛游侠
帖 子:191
专家分:106
注 册:2008-4-23
得分:2 
程序返回内存设备的对象,pDC是设备兼容的对象(CreateCompatibleDC(pDC);需要这个参数)
pwidth用于接收图片的实际宽度,pheight接收高
对于返回的CDC使用bitblt来绘制,本代码是用MFC写的,
如果你懂MFC那最好,注意使用完记得调用FreeBmp释放内存

代码这么多其实主要是考虑到错误处理,真正操作图片的代码就不多,就是读取文件数据然后调用CreateDIBitmap再seleteobject而已

CDC*LoadBmp(CString fileName,CDC*pDC,int *pwidth,int *pheight){                                                            
    CFile cf;//文件变量,用来对文件操作                     
    CFileException e;//出错处理
    BITMAPFILEHEADER bmfh;//BMP文件头变量
    BITMAPINFOHEADER bmih;//BMP文件信息变量
    BYTE *pData;//原始数据
    CDC *pMem;//内存设备
    HBITMAP hBitmap;//位图
    int n;//图象数据中BYTE的个数
    int width;//4倍对齐后的宽
    if (!cf.Open(fileName,CFile::modeRead, &e))//找到文件后,打开文件
    {
        MessageBox(NULL,"文件被其他程序占用了","",MB_OK);
        return NULL;
    }
   
    cf.SeekToBegin();
    cf.Read(&bmfh,sizeof(bmfh));//读取文件头
    cf.Read(&bmih,sizeof(bmih));//读取文件信息头
   
    if(bmfh.bfType!=0x4d42)
    {
        MessageBox(NULL,"文件格式错误","",MB_OK);
        cf.Close();
        return NULL;
    }
    if(bmih.biCompression!=BI_RGB)//BI_RGBD的非压缩格式
    {
        MessageBox(NULL,"文件需要解压","",MB_OK);
        cf.Close();
        return NULL;
    }
    width=(bmih.biWidth*4+3)/4;//4对齐
    n=bmih.biHeight*width*bmih.biBitCount/8+bmfh.bfOffBits-sizeof(BITMAPFILEHEADER);//计算数据字节数其中包括位图信息头
    pData=new BYTE[n];//为数据分配空间
    if(!pData)
    {
        MessageBox(NULL,"内存不足","",MB_OK);
        cf.Close();
        return NULL;
    }

    pMem = new CDC;//创建内存设备
    if(!pMem)
    {
        MessageBox(NULL,"内存不足","",MB_OK);
        cf.Close();
        delete [] pData;
        return NULL;
    }
        
    pMem->CreateCompatibleDC(pDC);//创建内存设备

    cf.SeekToBegin();
    cf.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
    cf.Read(pData,n);//读取数据
    hBitmap=CreateDIBitmap(pDC->m_hDC,&bmih,CBM_INIT,pData+bmfh.bfOffBits-sizeof(BITMAPFILEHEADER),
        (LPBITMAPINFO)pData,DIB_RGB_COLORS);//如创建一个屏幕大小的bitmap,这个函数将自动绘制图片
    pMem->SelectObject(hBitmap);//选择内存设备,图象将绘制在pMem上

    cf.Close();//关闭文件
    delete [] pData;
    DeleteObject(hBitmap);
    if(pwidth)
        *pwidth=bmih.biWidth;
    if(pheight)
        *pheight=bmih.biHeight;
    return pMem;
}

void FreeBmp(CDC*&pMem)
{
    if(!pMem) return;
    DeleteDC(pMem->m_hDC);//释放内存设备
    delete pMem;
    pMem=NULL;
}

[ 本帖最后由 faminxmu 于 2010-6-17 20:12 编辑 ]

在虚拟的世界中寻找目标。
2010-06-17 19:59
kelas
Rank: 6Rank: 6
等 级:侠之大者
帖 子:176
专家分:434
注 册:2010-5-28
得分:2 
额 没有用到什么头文件吗。。。
2010-06-17 22:55



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




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

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