加载中…
个人资料
jh_saya
jh_saya
  • 博客等级:
  • 博客积分:0
  • 博客访问:29,708
  • 关注人气:7
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

GDI+编程(图像/色彩/编码与解码)

(2012-04-08 16:52:12)
标签:

构造函数

图像

派生

维护

实现

杂谈

分类: GDI/GDI+/DX图像学

图像

GDI+主要是用Image类和Bitmap类实现图像的管理维护,Bitmap类是在Image类的基础上派生的.

Image类构造函数有两种:

  1. Image(filename, useEmbeddedColorManagement)
  2. Image(stream, useEmbeddedColorManagement)

filename:文件名.

stream:IStream接口对象(略).

useEmbeddedColorManagement:是否使用图片文件中的色彩校正信息(如ICM,Gamma校正),该参数默认值为FALSE.

 

加载图像后显示用的函数为:

  1. DrawImage(Image* image, ......)
  2. ......多种显示方式,下面接着介绍.

 

图像的剪裁与缩放

例子:

  1. Graphics graphics(hWnd);
  2. Image image(L"025-皮卡丘.png");
  3. // 在坐标(0,0)上绘制完整图像
  4. graphics.DrawImage(&image,0,0);
  5. // 获取图像宽度高度
  6. UINT width = image.GetWidth();
  7. UINT height = image.GetHeight();
  8. // 创建原图2倍大小的区域用于显示
  9. Rect rect(width+10, 0, 2*width, 2*height);
  10. graphics.DrawImage(
  11.     &image,
  12.     rect,                 // 显示区域,图像自动缩放为区域大小
  13.     0,0,                  // 取得原图左上角,作为显示的部分
  14.     0.5*width,0.5*height, // 取得原图右下角,作为显示的部分
  15.     UnitPixel
  16.     );

 

图片的简单旋转

Image(或Bitmap)对象的成员函数RotateFlip(RotateFlipType)可以旋转图片.参数RotateFlipType枚举定义为:

  1. enum RotateFlipType{
  2.     RotateNoneFlipNone = 0,
  3.     Rotate90FlipNone = 1,
  4.     Rotate180FlipNone = 2,
  5.     Rotate270FlipNone = 3,
  6.     RotateNoneFlipX = 4,
  7.     Rotate90FlipX = 5,
  8.     Rotate180FlipX = 6,
  9.     Rotate270FlipX = 7,
  10.     RotateNoneFlipY = Rotate180FlipX,
  11.     Rotate90FlipY = Rotate270FlipX,
  12.     Rotate180FlipY = RotateNoneFlipX,
  13.     Rotate270FlipY = Rotate90FlipX,
  14.     RotateNoneFlipXY = Rotate180FlipNone,
  15.     Rotate90FlipXY = Rotate270FlipNone,
  16.     Rotate180FlipXY = RotateNoneFlipNone,
  17.     Rotate270FlipXY = Rotate90FlipNone
  18. };

 

图片的反射和倾斜

例子:

  1. Graphics graphics(hWnd);
  2. Image image(L"bj.png");
  3. // 定义图形的目标显示区域
  4. Point points[] = {
  5.     Point(200,0),  // 原始图像左上角映射后的坐标
  6.     Point(400,0),  // 原始图像右上角映射后的坐标
  7.     Point(100,200) // 原始图像左下角映射后的坐标(平行四边形映射,右下角坐标略)
  8. };
  9. // 绘制基于平行四边形映射后的图像
  10. graphics.DrawImage(&image,points,3);

 

缩略图 

  1. Image* GetThumbnailImage(
  2.     UINT thumbWidth,   // 指明需要建立的缩放图的宽度
  3.     UINT yhumbHeight,  // 指明需要建立的缩放图的高度
  4.     GetThumbnailImageAbort callback,
  5.     VOID* callbackData
  6. );

callback,callbackData:建立缩略图时要用到的回调函数及回调函数中数据的存放地址.在GDI+1.0中不能使用.

例子:

  1. Graphics graphics(hWnd);
  2. Image image(L"bj.png");
  3. // 获取原图大小
  4. UINT width = image.GetWidth();
  5. UINT height = image.GetHeight();
  6. // 获取指定大小的缩略图
  7. Image* pThumbnai = image.GetThumbnailImage(width/2,height/2);
  8. graphics.DrawImage(pThumbnail,0,height);

 

克隆

分块显示图片:

  1. Graphics graphics(hWnd);
  2. Bitmap bitmap(L"025-皮卡丘.png");
  3. int bmpWidth = bitmap.GetWidth();
  4. int bmpHeight = bitmap.GetHeight();
  5. // 将图片切分为4个部分
  6. Rect rect[4] = {
  7.     Rect(0,0,bmpWidth/2,bmpHeight/2),
  8.     Rect(bmpWidth/2,0,bmpWidth/2,bmpHeight/2),
  9.     Rect(0,bmpHeight/2,bmpWidth/2,bmpHeight/2),
  10.     Rect(bmpWidth/2,bmpHeight/2,bmpWidth/2,bmpHeight/2),
  11. };
  12. // 分别克隆图片的4个部分
  13. Bitmap* s[4] = {
  14.     bitmap.Clone(rect[0],PixelFormatDontCare),
  15.     bitmap.Clone(rect[1],PixelFormatDontCare),
  16.     bitmap.Clone(rect[2],PixelFormatDontCare),
  17.     bitmap.Clone(rect[3],PixelFormatDontCare)
  18. };
  19. // 分别绘制图片的4个部分
  20. graphics.DrawImage(s[0],0,0);
  21. Sleep(1000); // 延时1000毫秒
  22. graphics.DrawImage(s[1],bmpWidth/2,0);
  23. Sleep(1000);
  24. graphics.DrawImage(s[2],0,bmpHeight/2);
  25. Sleep(1000);
  26. graphics.DrawImage(s[3],bmpWidth/2,bmpHeight/2);

--------------------------------------------------------------------------------------------------

色彩

--------------------------------------------------------------------------------------------------

编码与解码

编码:编码代表对图形文件数据的一种组织形式,它包含数据的压缩,色彩的映射(调色板)之类的概念.

解码:解码则表示软件对图形文件数据的解析方式.

不同格式的图形文件对应着不同的编码与解码方式.

 

图形格式的基础,"头文件","文件体","文件尾".

文件头主要包括产生或编辑该图像文件的软件信息以及图像本身的参数.这些参数必须完整地描述图像数据的所有特征,因此是图像文件中的关键数据.当然,根据不同的文件,有的参数是可选的.例如,压缩算法对应的文件夹参数.有的文件对图像数据不使用压缩,有的文件可选择多种方法压缩数据.

文件体主要包括图像数据以及色彩变换查找表或调色板数据.

文件尾可包含一些用户信息.文件尾是可选项,有的文件格式不包括这部分内容. 

 

PNG文件的组成 

8字节的PNG文件签名域用来识别该文件是否PNG文件.该域的值分别为:

十进制数  137 80 78 71 13 10 26 10

十六进制数 89 50 4e 47 0d 0a 1a 0a

 

关键数据块中的4个标准数据块是:

(1)文件头数据块IHDR(Header Chunk):包含有PNG文件中存储的图像数据的基本信息,并作为第一个数据块出现在PNG数据流中.文件头数据块由13个字节组成:

域的名称           字节数  说明

Width                    图像宽度,以像素为单位

Height                  图像高度,以像素为单位

Bitdepth                图像色彩深度:索引彩色为1,2,4或8;灰度为1,2,4,8或16;真彩色为8或16

ColorType               颜色类型:0灰度;2真彩色;3索引彩色;

                                    4带Alpha通道数据灰度;6带Alpha通道数据真彩色

Compression method 1      压缩方法(LZ77派生算法)

Filter method           滤波器方法

Interlace method       隔行扫描方法:0为非隔行扫描;1为Adam7(Adam的7遍隔行扫描)

(2)调色板数据块PLTE(Palette Chunk):...

(3)图像数据块IDAT:...

(4)调色板数据块IEND(Image Trailer Chunk):...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有