图片缩放

缩放原理:
原图和缩放图内点的位置,在图片中的相对位置不变。

缩放图中每个点的都可以根据图中公式计算出在原图中的位置,然后把原图颜色赋给缩放图。可以用两个for循环复制数据。
函数原型:int PicZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic)
图片的象素数据结构体PixelDatas,用缩放后的数据更改该结构体内容。
优化:
1.每行的Sy坐标不变,所以在第一个for循环里计算y坐标。
2.Sx每行都要重新计算,但是对整个图来说每行的Sx参数是一样的,可以先计算出来保存在数组里。

int PicZoom(PT_PixelDatas ptOriginPic, PT_PixelDatas ptZoomPic){unsigned long dwDstWidth = ptZoomPic->iWidth;unsigned long* pdwSrcXTable;unsigned long dwSrcY;unsigned long dwPixelBytes = ptOriginPic->iBpp/8;if (ptOriginPic->iBpp != ptZoomPic->iBpp){return -1;}pdwSrcXTable = malloc(sizeof(unsigned long) * dwDstWidth);if (NULL == pdwSrcXTable){DBG_PRINTF("malloc error!\n");return -1;}for (unsigned long x = 0; x < dwDstWidth; x++)        //生成表 pdwSrcXTable    pdwSrcXTable[x]=(x*ptOriginPic->iWidth/ptZoomPic->iWidth);for (unsigned long y = 0; y < ptZoomPic->iHeight; y++) {            dwSrcY = (y * ptOriginPic->iHeight / ptZoomPic->iHeight);unsigned char *pucDest = ptZoomPic->aucPixelDatas + y*ptZoomPic->iLineBytes;unsigned char *pucSrc  = ptOriginPic->aucPixelDatas + dwSrcY*ptOriginPic->iLineBytes;for (x = 0; x <dwDstWidth; x++)/* 原图座标: pdwSrcXTable[x],srcy* 缩放座标: x, y*/        //从原图拷贝到缩放图,长度为bppmemcpy(pucDest+x*dwPixelBytes, pucSrc+pdwSrcXTable[x]*dwPixelBytes, dwPixelBytes);}    free(pdwSrcXTable);return 0;
}

转换bpp

函数原型CovertOneLine(iWidth, iBMPBpp, ptPixelDatas->iBpp, pucSrc, pucDest);
           宽度  源bpp    目的bpp  源数据地址 目的数据地址
从源数据地址,逐个像素处理,若是24位直接复制,若不是,则取出蓝绿红三个字节进行颜色转换,赋给目的地址。

static int CovertOneLine(int iWidth, int iSrcBpp, int iDstBpp, unsigned char *pudSrcDatas, unsigned char *pudDstDatas){unsigned int dwRed,dwGreen,dwBlue;unsigned int dwColor;unsigned short *pwDstDatas16bpp = (unsigned short *)pudDstDatas;  //16位bpp,2字节unsigned int   *pwDstDatas32bpp = (unsigned int *)pudDstDatas;      //32位bpp,4字节if (iDstBpp == 24)     //源24bpp,目的的bpp相同,直接复制    memcpy(pudDstDatas, pudSrcDatas, iWidth*3);else{for (int i = 0; i < iWidth; i++){dwBlue  = pudSrcDatas[pos++]; //取出蓝绿红数据,3字节dwGreen = pudSrcDatas[pos++];dwRed   = pudSrcDatas[pos++];if (iDstBpp == 32){       //算出32位的bpp,红绿蓝  dwColor = (dwRed << 16) | (dwGreen << 8) | dwBlue;*pwDstDatas32bpp = dwColor;pwDstDatas32bpp++;}else if (iDstBpp == 16){  //算出16位的bpp,红绿蓝565       /* 565 */dwRed   = dwRed >> 3;dwGreen = dwGreen >> 2;dwBlue  = dwBlue >> 3;dwColor = (dwRed << 11) | (dwGreen << 5) | (dwBlue);*pwDstDatas16bpp = dwColor;pwDstDatas16bpp++;}}}return 0;
}

图片合并

函数原型int PicMerge(int iX, int iY, PT_PixelDatas ptSmallPic, PT_PixelDatas ptBigPic)
将小图片合并到大图片的(x,y)处,参数为8.3.2中自定义的图片描述结构体指针PT_PixelDatas。将小图片内容memcpy复制到大图片对应位置处。

把小图片合并入大图片里

int PicMerge(int iX, int iY, PT_PixelDatas ptSmallPic, PT_PixelDatas ptBigPic){if ((ptSmallPic->iWidth > ptBigPic->iWidth)  ||(ptSmallPic->iHeight > ptBigPic->iHeight) ||(ptSmallPic->iBpp != ptBigPic->iBpp)){return -1;}unsigned char *pucSrc = ptSmallPic->aucPixelDatas;unsigned char *pucDst = ptBigPic->aucPixelDatas + iY * ptBigPic->iLineBytes + iX * ptBigPic->iBpp / 8;for (int i = 0; i < ptSmallPic->iHeight; i++){memcpy(pucDst, pucSrc, ptSmallPic->iLineBytes);pucSrc += ptSmallPic->iLineBytes;pucDst += ptBigPic->iLineBytes;}return 0;
}

把新图片的某部分, 合并入老图片的指定区域

int PicMergeRegion(int iStartXofNewPic, int iStartYofNewPic, int iStartXofOldPic, int iStartYofOldPic, int iWidth, int iHeight, PT_PixelDatas ptNewPic, PT_PixelDatas ptOldPic){int iLineBytesCpy = iWidth * ptNewPic->iBpp / 8;if ((iStartXofNewPic < 0 || iStartXofNewPic >= ptNewPic->iWidth) || \(iStartYofNewPic < 0 || iStartYofNewPic >= ptNewPic->iHeight) || \(iStartXofOldPic < 0 || iStartXofOldPic >= ptOldPic->iWidth) || \(iStartYofOldPic < 0 || iStartYofOldPic >= ptOldPic->iHeight)){return -1;}unsigned char *pucSrc = ptNewPic->aucPixelDatas + iStartYofNewPic * ptNewPic->iLineBytes + iStartXofNewPic * ptNewPic->iBpp / 8;unsigned char *pucDst = ptOldPic->aucPixelDatas + iStartYofOldPic * ptOldPic->iLineBytes + iStartXofOldPic * ptOldPic->iBpp / 8;for (int i = 0; i < iHeight; i++){memcpy(pucDst, pucSrc, iLineBytesCpy);pucSrc += ptNewPic->iLineBytes;pucDst += ptOldPic->iLineBytes;}return 0;
}

图片缩放 转换bpp 图片合并相关推荐

  1. Android代码(Handler的运用),HttpURLConnection的应用,将url图片地址转换成图片。

     1 布局文件, <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  2. Python图片格式转换,图片压缩

    PyQt 图片格式转换,图片压缩 界面展示 # -*- coding: utf-8 -*- import osfrom PIL import Image from PIL.ImageFile impo ...

  3. php将已有图片缩放尺寸,PHP图片重新采样及大小缩放-imagecopyresampled用法实例

    /** * 图片缩放函数(可设置高度固定,宽度固定或者最大宽高,支持gif/jpg/png三种类型) * Author : Specs * Homepage: http://9iphp.com * * ...

  4. linux jpg图片缩放,ImageMagick之图片缩放

    利用ImageMagicK的convert命令,能很方便的实现图片的放大缩小,可以进行等比例缩放,也能缩放到指定的固定大小.缩放的参数resize,由它来指定缩放后图片的宽高,比如"200× ...

  5. java 图片转jpg图片_JAVA转换jpg图片为渐进式图片

    很早之前看到一篇<web前端图片极限优化策略>,了解有jpg分为baseline-jpeg和preogressive-jpeg. 具体的区别如下: baseline-jpeg: 在文件较大 ...

  6. 【opencv2】图片大小转换和图片的保存

    闲话少说,先看程序: <span style="font-size:18px;">#include <string> #include <iostre ...

  7. Java修改图片大小尺寸图片缩放(URL图片和本地图片)

    方式一:使用Image.getScaledInstance 使用jdk的awt包下的Image.getScaledInstance实现图片的缩放.好处是无需引入第三方jar,缺点是会稍微有点模糊. 工 ...

  8. 前端图片在线转换Base64 图片编码Base64

    首先讲一下什么是图片Base64编码: 简单来说,图片的base64编码就是可以将一副图片数据编码成一串字符串,使用该字符串代替图像地址. 为什么要用Base64? 我们知道,我们所看到的网页上的每一 ...

  9. c# emgucv 切图_自己积累的一些Emgu CV代码(主要有图片格式转换,图片裁剪,图片翻转,图片旋转和图片平移等功能)...

    using System; using System.Drawing; using System.Drawing.Imaging; using System.Runtime.InteropServic ...

最新文章

  1. 至2019年全球Hadoop市场年复合增长率将达53%
  2. 深度有趣 | 26 Seq2Seq机器翻译
  3. 在linux和windows下自动备份数据库
  4. python 字符串拼接_面试官让用 3 种 python 方法实现字符串拼接 ?对不起我有8种……...
  5. Flex Application里的addChild()
  6. js中推断浏览器类型
  7. Linux系统调用--getrusage函数详解
  8. php本地文件打包代码,PHP实战:几行代码轻松实现PHP文件打包下载zip
  9. Windows + IDEA + SBT 打造Spark源码阅读环境
  10. 桌面计算机安全策略,设置组策略实现Windows桌面显示计算机信息
  11. 8005.ros2 添加boost库asio编程
  12. [docker][win10]安装的坑
  13. Mac精品软件分享第一期
  14. Cocos2d-x移植Android 常见问题处理办法
  15. Yii 文件上传类的使用
  16. WordPress Feed跳转
  17. 面向数据中心,浪潮存储双剑出鞘
  18. 血淋淋的 BUG:波音在软件开发上错在哪里?
  19. 使用EndNote在Word中插入参考文献的格式设置
  20. 【jmeter】JMeter日志查看与日志分析

热门文章

  1. 取消上次commit
  2. 财经小知识——CRS风暴与全球离岸金融中心
  3. 〖编程初学者的自我修养 - 职业规划篇②〗- 进入职场前必须要考虑的问题
  4. IDEA从零到精通(27)之Eclipse Code Formatter插件的安装与使用
  5. 别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!
  6. ArcGIS:如何进行半自动化跟踪和全自动化跟踪?
  7. 【物理应用】基于matlab车辆二自由度悬架鲁棒控制【含Matlab源码 2324期】
  8. java基础问题疑点总结
  9. Milvus 数据处理流程解剖
  10. 干货丨重中之重:数据分析中常用指标及术语!