zoukankan      html  css  js  c++  java
  • 利用GDI+处理图像,包括图像的的裁剪显示、转置、镜像、简单旋转、变形等。

    一、图像的裁剪显示:有时程序需要显示图像的一部分而不是全部。实例代码如下:

    CDC* pDC = GetDC();
    
    Graphics graph(pDC->GetSafeHdc());
    
    Image image(_T("Pic.jpg"));
    
    // 表示从原图的(20,20)处开始,裁剪宽高为300,400的矩形区域,将其显示在(10,10)处
    
    graph.DrawImage(&image,10,10,20,20,300,400,UnitPixel);
    
    ReleaseDC(pDC);

    注意:对于不同的分辨率,这个函数可能对图像进行了缩放,可以通过以下函数进行输出尺寸的控制。

    DrawImage(Image* image,const Rect& destRect,INT srcx,INT srcy,INT srcwidth,INT srcheight,Unit srcUnit...),其中destRect表示输出图像的矩形区域。

    二、图像的转置:就是将图像的x坐标与y坐标交交换位置。转置于旋转是不同的。转置前的图无法通过旋转得到转置后的图。可以使用以下函数进行转置处理:

    Status Graphics::DrawImage(Image* image,const Point* desPoints,INT count);

    Status Graphics::DrawImage(Image* image,const PointF* desPoints,INT count);

    其中,若count为3时,则表示该多边形是一个平行四边形,另一个顶点由系统自动给出。此时,destPoints中的数据依次对应于源图像的左上角、右上角和左下角的顶点坐标。

    graph.DrawImage(&image, 0, 0); // 输出原图像
    
    // 输出图像的左上角坐标
    
    int nX = 200; 
    int nY = 0;
    
    int nWidth = image.GetWidth();
    int nHeight = image.GetHeight();
    
    Point points[] = {
    Point(nX,nY),        // 源图像的左上角对应的目标图像的坐标
    Point(nX,nY + nWidth),  // 源图像的右上角对应的目标图像的坐标
    Point(nX + nHeight,nY)       // 源图像的左下角对应的目标图像的坐标
    };
    graph.DrawImage(&image, points, 3);

    三、图像的镜像:分为水平与垂直镜像。水平镜像类似镜子,垂直镜像类似于水中的投影。

    (1)水平镜像

    graph.DrawImage(&image, 0, 0);
    
    int nX = 600;
    int nY = 0;
    
    int nWidth = image.GetWidth();
    int nHeight = image.GetHeight();
    
    Point points[] = {
    Point(nX + nWidth,nY),       // 源图像的左上角对应的目标图像的坐标
    Point(nX,nY),            // 源图像的右上角对应的目标图像的坐标
    Point(nX + nWidth,nY +nHeight)  // 源图像的左下角对应的目标图像的坐标
    };
    graph.DrawImage(&image, points, 3);

    (2)垂直镜像

    graph.DrawImage(&image, 0, 0);
    
    int nX = 0;
    int nY = 400;
    
    int nWidth = image.GetWidth();
    int nHeight = image.GetHeight();
    
    Point points[] = {
    Point(nX ,nY + nHeight),
    Point(nX+nWidth,nY +nHeight),
    Point(nX,nY )
    };
    graph.DrawImage(&image, points, 3);

     四、图像的简单旋转:

    (1)图像旋转 90°

    int nX = 700;
    int nY = 0;
    
    Point points[] = {
    Point(nX + nHeight,nY),    // 源图像的左上角对应的目标图像的坐标
    Point(nX+nHeight,nY+nWidth),  // 源图像的右上角对应的目标图像的坐标
    Point(nX,nY)           // 源图像的左下角对应的目标图像的坐标
    };
    graph.DrawImage(&image, points, 3);

    (2) 图像旋转180°

    int nX = 700;
    int nY = 0;
    Point points[] = {
    Point(nX + nWidth,nY + nHeight), // 源图像的左上角对应的目标图像的坐标
    Point(nX,nY + nHeight),      // 源图像的右上角对应的目标图像的坐标
    Point(nX + nWidth,nY)       // 源图像的左下角对应的目标图像的坐标
    };
    graph.DrawImage(&image, points, 3);

    五、图像的变形:

    int nX = 600;
    int nY = 0;
    Point points[] = {
    Point(nX,nY),             // 源图像的左上角对应的目标图像的坐标
    Point(nX + nWidth,nY + 0),      // 源图像的右上角对应的目标图像的坐标
    Point(nX + 60,nY + nHeight)    // 源图像的左下角对应的目标图像的坐标
    };
    graph.DrawImage(&image, points, 3);
  • 相关阅读:
    命令行jarsigner签字和解决找不到证书链错误
    ERROR ITMS-90034
    module.exports 和 exports
    php扩展包
    switch的使用
    debug安卓屏幕滑动会抖动
    react native编译报错
    使用iTerm2替代Mac自带Terminal终端
    编码转换
    git 操作远程 本地缓存删除
  • 原文地址:https://www.cnblogs.com/luzuwei/p/9017380.html
Copyright © 2011-2022 走看看