VB 如何将GDI内存图像保存为本地文件

mkw0007 mkw0007 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
代码如下:
Dim DataArr(0 To 3) As Byte, pDataArr(0 To 0) As Long
GdipLoadImageFromFile StrConv(picFile, vbUnicode), img '将图片文件picFile 读入Img中
GdipGetImageBounds img, Dimensions, UnitPixel '获得Img图像文件的尺寸,保存入Dimensions结构体中
Rct.Right = Dimensions.nWidth
Rct.Bottom = Dimensions.nHeight
GdipBitmapLockBits img, Rct, ImageLockModeRead, PixelFormat, BmpData '读取图像的数据
MakePoint VarPtrArray(DataArr), VarPtrArray(pDataArr), OldArrPtr, OldpArrPtr '模拟指针
pDataArr(0) = BmpData.scan0 '指向图像在内存中的首地址
PixelAddBytes = IIf(PixelFormat = PixelFormat32bppRGB, 4, 3) '每个像素所占用的字节数
LineAddBytes = BmpData.Stride - BmpData.Width * PixelAddBytes '每个扫描行中多余的字节数,不需要处理的
For Y = 1 To BmpData.Height '从上到下扫描
For X = 1 To BmpData.Width '从左到右扫描
DataArr(0) = 255 '具体的算法, DataArr(2) =r, DataArr(1) =g, DataArr(0)=b,对像素的rgb值进行特定的处理,可以获得特定的效果的新图像,比如各种滤镜,反色,黑白,模糊等等效果,具体的像素处理算法就是高科技了
DataArr(1) = 255
DataArr(2) =255
Next
pDataArr(0) = pDataArr(0) + LineAddBytes '一到下一个扫描行的起始位置
Next
FreePoint VarPtrArray(DataArr), VarPtrArray(pDataArr), OldArrPtr, OldpArrPtr '释放模拟指针
GdipBitmapUnlockBits img, BmpData '更新数据
Pic.picture=Loadpicture("")
pic.Width=BmpData.Height-100
pic.Height=BmpData.Height-100
GdipCreateFromHDC Pic.hdc, graphics '图片框DC中绘制图像,当pic的尺寸太大时,Pic.hdc变成无法创建autoredraw对象了,失效了,这时候如何创建内存hdc设备呢?然后将新图像绘制到内存dc上,而不是通过图片框来中转,然后如何将内存的hdc绘制好的图像保存为文件呢?
GdipDrawImageRectRectI graphics, img, 0, 0, BmpData.Width-100, BmpData.Height-100, 100, 100, BmpData.Width-100, BmpData.Height-100, UnitPixel '将原图像Img的起点坐标(100,100)处开始,截取BmpData.Width-100, BmpData.Height-100的新区域图像
GdipDeleteGraphics graphics
Pic.Refresh '刷新
SavePicture a, "C:\Out.jpg" '保存新图像,问题出在这里,当pic的尺寸太大时,比如超过五六七像素以上,pic.hdc变成无法创建autoredraw对象了,所以,如何不通过pic.hdc,而是通过内存hdc的方式,直接将img中指定的区域图像复制到此内存hdc中,然后直接将此内存新图像保存为文件,而通过图片框来中转呢?
GdipDisposeImage img '销毁GDI+对象
GdiplusShutdown Token '关闭GDI+




...全文

相关推荐

VB柔化模糊图像的实例

你可以加载本地文件或从内存中创建Bitmap对象,例如,使用`New Bitmap("image.jpg")`来加载一个JPG文件。3.

faasf25366

vb6.0截取当前窗体保存为jpg文件,如何实现?

🏆本文收录于专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家!持续更新中,up!up!up!!

bug菌¹

VB实现摄像头调用与图像捕获保存指南

Visual Basic (VB) 是微软公司于1991年推出的一款事件驱动编程语言,它的出现极大地简化了Windows应用程序的开发。VB以其直观的编程方式和丰富的开发工具,迅速成为众多开发者的首选。随着时间的推移,VB经历了从VB6到VB.NET的转型,后者与.NET框架紧密集成,支持面向对象的编程模式,标志着VB走向了更为成熟的开发语言。API函数实际上是操作系统或其它软件组件提供给用户的接口,它允许程序员通过预定义的函数来访问特定的功能。

十八像朵花

在VB中实现PNG图像资源应用的实战指南

图形处理是计算机视觉和图像处理领域的核心议题,而在众多图像格式中,PNG格式以其独特的优势在专业和非专业领域中广受欢迎。本章将简要介绍PNG图像的几个主要优势,为读者提供一个基础的理解。GDI+作为Windows平台下的图形处理库,能够执行各种图形操作任务,如绘图、图像处理、文本渲染等。它的核心优势包括:支持多种图形格式:GDI+支持多种图像格式,尤其是高质量的PNG图像,这种格式支持无损压缩和透明度。

安检

vb图像绘制处理系统程序

菜单和对话框:VB的MenuStrip控件可以创建菜单栏,为用户提供更多的操作选项。而FileDialog控件则可以帮助用户选择本地文件,如打开或保存图像。

feelingroom
评论 3
收藏 已收藏
分享
返回顶部
mkw0007
API 1,488 成员 23,270 内容