热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于图像处理的几段代码,存此待查

根据源图RECT、目标Rect计算缩放后(不放大),新的显示Rect序列化CImageCImage复制根据源图RECT、目标Rect计算缩放后(不放大),新的显示Rectstati



根据源图RECT、目标Rect计算缩放后(不放大),新的显示Rect


序列化CImage


CImage复制


//根据源图RECT、目标Rect计算缩放后(不放大),新的显示Rect


static void GetStretchRect(CRect*rcResult, const CRect rcDst, const CRect rcSrc);






void CPublicStaticMethods::GetStretchRect(CRect *rcResult, const CRect rcDst, const CRect rcSrc)
{
//计算按原图比例缩小后的图片的大小
int nWidth = rcSrc.Width();
int nHeight = rcSrc.Height();
int nDstWidth = rcDst.Width();
int nDstHeight = rcDst.Height();

int nResultLeft = 0;
int nResultTop = 0;
int nResultWidth = nWidth;
int nResultHeight = nHeight;

if (nWidth <= nDstWidth && nHeight <= nDstHeight)
{
nResultLeft
= (nDstWidth - nResultWidth) / 2;
nResultTop
= (nDstHeight - nResultHeight) / 2;
}
else
{
//源宽高比
float fSrcScale = (float)nWidth / (float)nHeight;
//目标宽高比
float fDstScale = (float)nDstWidth / (float)nDstHeight;
//如果源比 > 目标比,则以宽为绽放标准
if (fSrcScale > fDstScale)
{
float fScale = (float)nDstWidth / (float)nWidth;
nResultWidth
= nDstWidth;
nResultHeight
= (int)(nHeight * fScale);
nResultLeft
= 0;
nResultTop
= (nDstHeight - nResultHeight) / 2;
}
else
{
float fScale = (float)nDstHeight / (float)nHeight;
nResultHeight
= nDstHeight;
nResultWidth
= (int)(nWidth * fScale);
nResultTop
= 0;
nResultLeft
= (nDstWidth - nResultWidth) / 2;
}
}

rcResult
->left = nResultLeft;
rcResult
->top = nResultTop;
rcResult
->right = nResultLeft + nResultWidth;
rcResult
->bottom = nResultTop + nResultHeight;
}


View Code

 


//序列化CImage
    static void SerializeCImage(CImage&srcImage, CArchive &ar);






void CPublicStaticMethods::SerializeCImage(CImage&srcImage, CArchive &ar)
{
int srcBitsCount = 0;
int srcWidth = 0;
int srcHeight = 0;
int srcPitch = 0;
int nColors = 0;//调色板数量
if (ar.IsStoring())
{
if (srcImage.IsNull())
{
ar
< srcHeight ;
return;
}
else
{
srcBitsCount
= srcImage.GetBPP();
srcWidth
= srcImage.GetWidth();
srcHeight
= srcImage.GetHeight();
srcPitch
= srcImage.GetPitch();

ar
< srcHeight;
if (srcWidth == 0 || srcHeight == 0)
return;
ar
< srcPitch;
RGBQUAD pal[256];
if (srcBitsCount <= 8 && srcImage.IsIndexed())//需要调色板
{
nColors
= srcImage.GetMaxColorTableEntries();
}
ar
<< nColors;
if (nColors>0)
{
srcImage.GetColorTable(
0, nColors, pal);
ar.Write(pal,
sizeof(RGBQUAD) * nColors);
}
BYTE
* srcPtr = (BYTE*)srcImage.GetBits();
//复制图像数据
for (int i = 0; i)
{
ar.Write(srcPtr + i * srcPitch, abs(srcPitch));
}
}
}
else
{
ar
>> srcWidth >> srcHeight ;
if (srcWidth == 0 || srcHeight == 0)
return;
ar
>> srcBitsCount >> srcPitch;
ar
>> nColors;

//销毁原有图像
if (!srcImage.IsNull())
{
//destImage.ReleaseDC();
srcImage.Detach();
srcImage.Destroy();
}
//创建新图像
if (srcBitsCount == 32) //支持alpha通道
{
srcImage.Create(srcWidth, srcHeight, srcBitsCount,
1);
}
else
{
srcImage.Create(srcWidth, srcHeight, srcBitsCount,
0);
}
//加载调色板
if (nColors>0&&nColors<=256)//需要调色板
{
RGBQUAD pal[
256];
ar.Read(pal,
sizeof(RGBQUAD) * nColors);
srcImage.SetColorTable(
0, nColors, pal);//复制调色板程序
}
//目标图像参数
BYTE *srcPtr = (BYTE*)srcImage.GetBits();
//复制图像数据
for (int i = 0; i)
{
ar.Read(srcPtr + i * srcPitch, abs(srcPitch));
}
}
}


View Code

//CImage复制






BOOL CPublicStaticMethods::ImageCopy(const CImage &srcImage, CImage &destImage)
{
int i;//循环变量
if (srcImage.IsNull())
return FALSE;
//源图像参数
BYTE* srcPtr = (BYTE*)srcImage.GetBits();
int srcBitsCount = srcImage.GetBPP();
int srcWidth = srcImage.GetWidth();
int srcHeight = srcImage.GetHeight();
int srcPitch = srcImage.GetPitch();
//销毁原有图像
if (!destImage.IsNull())
{
//destImage.ReleaseDC();
destImage.Detach();
destImage.Destroy();
}
//创建新图像
if (srcBitsCount == 32) //支持alpha通道
{
destImage.Create(srcWidth, srcHeight, srcBitsCount,
1);
}
else
{
destImage.Create(srcWidth, srcHeight, srcBitsCount,
0);
}
//加载调色板
if (srcBitsCount <= 8 && srcImage.IsIndexed())//需要调色板
{
RGBQUAD pal[
256];
int nColors = srcImage.GetMaxColorTableEntries();
if (nColors>0)
{
srcImage.GetColorTable(
0, nColors, pal);
destImage.SetColorTable(
0, nColors, pal);//复制调色板程序
}
}
//目标图像参数
BYTE *destPtr = (BYTE*)destImage.GetBits();
int destPitch = destImage.GetPitch();
//复制图像数据
for (i = 0; i)
{
memcpy(destPtr + i * destPitch, srcPtr + i * srcPitch, abs(srcPitch));
}

return TRUE;
}


View Code

 





推荐阅读
  • 深入解析 Android 中的 ActivityGroup 实现
    本文详细探讨了如何在 Android 应用中使用 ActivityGroup 来实现类似微博客户端主界面的效果,并分析了 TabActivity 的局限性,推荐使用更为灵活的 ActivityGroup 方案。 ... [详细]
  • 本文详细介绍了Java编程语言中的关键字及其用途,包括53个关键字和2个保留字。文章不仅解释了每个关键字的基本功能,还提供了实际应用场景中的使用示例。 ... [详细]
  • 使用URLHttpConnection获取并展示图片至ImageView的方法
    本文介绍如何通过URLHttpConnection方式从网络加载图片,并将其显示在Android应用的ImageView组件上。包括布局文件和Java代码的具体实现。 ... [详细]
  • Android 5 及以上版本中使用存储访问框架(SAF)实现 SD 卡写入权限的方法
    本文探讨了在 Android 5 及更高版本中通过存储访问框架(Storage Access Framework, SAF)实现对 SD 卡文件的写入与重命名操作。文章分析了 SAF 的工作原理,并提供了一个示例应用的代码实现,展示了如何正确获取并使用用户授予的写入权限。 ... [详细]
  • POJ2226 二分图最小覆盖问题
    在一个大小为n×m的网格中,部分单元格为泥泞状态,其余为干净。目标是使用宽度固定为1但长度可变的木板覆盖所有泥泞单元格,且不覆盖任何干净单元格。木板允许重叠。本问题通过构建二分图并求其最小覆盖来解决。 ... [详细]
  • iOS 面试实战:15 道经典面试题及解析
    本文精选了15道iOS面试题,并提供了详细的解答思路。旨在帮助开发者更好地准备面试,避免因准备不足而导致的紧张和焦虑。 ... [详细]
  • 本文档详细介绍了如何在Android应用中实现侧滑菜单(SlidingMenu)功能,包括设置侧边栏、全屏触摸模式以及初始化Fragment的具体步骤。 ... [详细]
  • 电子与正电子的相互作用
    本文探讨了电子与正电子之间的基本物理特性及其在现代物理学中的应用,包括它们的产生、湮灭过程以及在粒子加速器和宇宙射线中的表现。 ... [详细]
  • 利用Executor框架管理线程池
    本文介绍了如何使用Executor框架来管理和创建线程池,包括不同的线程池类型及其应用场景,以及如何通过Executors工厂类创建不同类型的Executor实例。 ... [详细]
  • 本文提供了一个Android应用中用于抓取网页信息并下载图片的示例代码。通过该代码,开发者可以轻松实现从指定URL获取网页内容及其中的图片资源。 ... [详细]
  • 探讨如何在C++中,当子类实例存储在父类类型的向量中时,正确访问子类特有的成员变量或方法。 ... [详细]
  • 本文详细介绍了`org.kie.workbench.common.stunner.bpmn.definition.UserTask.getGeneral()`方法的使用场景和具体实现,并提供了多个实际代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 第三周课堂测试1、使用汇编语言编写指令时,用一些简单的容易记忆的符号来代替二进制指令,比机器语言更为方便,属于高级语言。(B ... [详细]
  • 使用Objective-C实现苹果官方NSLayoutConstraint页面布局
    本文详细介绍了如何在iOS开发中使用Objective-C语言通过NSLayoutConstraint来实现页面布局。示例代码展示了如何创建和应用约束,以确保界面元素能够正确地响应不同屏幕尺寸的变化。 ... [详细]
  • 本文介绍了一种算法,用于在一个给定的二叉树中找到一个节点,该节点的子树包含最大数量的值小于该节点的节点。如果存在多个符合条件的节点,可以选择任意一个。 ... [详细]
author-avatar
李燕七
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有