游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2159|回复: 3

[求教] 请问如何用程序读取JPG文件中的图像宽度和高度?

[复制链接]

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
发表于 2005-11-3 23:06:00 | 显示全部楼层 |阅读模式
JPG文件中表示图像的宽度和高度的地址不固定,要如何来确定其位置呢?非常感谢!

20

主题

398

帖子

398

积分

中级会员

Rank: 3Rank: 3

积分
398
 楼主| 发表于 2005-11-3 23:23:00 | 显示全部楼层

Re:[求教] 请问如何用程序读取JPG文件中的图像宽度和高度?

看了一下D3D的文档,找到了答案,可以利用
HRESULT WINAPI D3DXGetImageInfoFromFile(          LPCSTR pSrcFile,
    D3DXIMAGE_INFO *pSrcInfo
);
函数来获得图像的信息!

8

主题

239

帖子

239

积分

中级会员

Rank: 3Rank: 3

积分
239
发表于 2005-11-4 13:18:00 | 显示全部楼层

Re:[求教] 请问如何用程序读取JPG文件中的图像宽度和高度?

        static BOOL GetJPGSize(const char* pFileName, long* pW, long* pH){
                BOOL isOK = FALSE;
                std::ifstream ostm(pFileName, std::ios::binary);
                ostm.seekg(0,std::ios::end);
                long size = ostm.tellg();
                ostm.seekg(0,std::ios::beg);

                BOOL done = FALSE;
                unsigned int length;
                unsigned char a;
                unsigned char b;
                unsigned char c;
                unsigned char d;
                unsigned char ch = 0;
                unsigned int i = 0;
                BYTE cc1=0, cc2 = 0;
               
                if (size>0){
                        cc1 = ostm.get();
                        cc2 = ostm.get();
                        i = 2;
                        if(cc1 == (unsigned char)255 && cc2 == (unsigned char)216){
                                while (ch != (unsigned char)218 && !done){
                                        // Find Next Marker
                                        while ((unsigned int)ch != 255 && !done){
                                                if (i < size){
                                                        ostm.seekg(i, std::ios::beg);
                                                        ostm.read((char*)&ch, 1);
                                                        i++;
                                                }
                                                else done = TRUE;
                                        }
                                        // Skip Marker Padding
                                        while ((unsigned int)ch == 255 && !done){
                                                if (i < size){
                                                        ostm.seekg(i, std::ios::beg);
                                                        ostm.read((char*)&ch, 1);
                                                        i++;
                                                }
                                                else done = TRUE;
                                        }
                                        // Check If At Size
                                        if ((unsigned int)ch >= 192 && (unsigned int)ch <= 195){
                                                if (i + 3 < size){
                                                        i+=3;
                                                        ostm.seekg(i, std::ios::beg);
                                                        ostm.read((char*)&a, 1);
                                                        ostm.read((char*)&b, 1);
                                                        ostm.read((char*)&c, 1);
                                                        ostm.read((char*)&d, 1);
                                                        *pW = (((unsigned int)c * 256) | (unsigned int)d);
                                                        *pH = (((unsigned int)a *256) | (unsigned int)b);
                                                        if(*pW>0 && *pH>0){
                                                          isOK = TRUE;
                                                        }
                                                }
                                                done = TRUE;
                                        }
                                        else{
                                                // Skip Variable Data
                                                if (i + 1 < size){
                                                        ostm.seekg(i, std::ios::beg);
                                                        ostm.read((char*)&a, 1);
                                                        ostm.read((char*)&b, 1);
                                                        i+=2;
                                                        length = (((unsigned int)a * 256) | (unsigned int)b);
                                                        if (length < 2) done = TRUE;
                                                        else if (i < size) i = i + length - 2;
                                                }
                                                else done = TRUE;
                                        }
                                }
                        }
                }
                ostm.close();
                return isOK;
        }
};

11

主题

162

帖子

189

积分

注册会员

Rank: 2

积分
189
QQ
发表于 2005-11-4 18:55:00 | 显示全部楼层

Re:[求教] 请问如何用程序读取JPG文件中的图像宽度和高度?

如果用的是 SDL:

SDL_Surface *img = IMG_Load("test1.jpg");

将图片调入后 img->w 和 img->h 就是宽度和高度
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 12:08

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表