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

时间:2022-09-26 11:49:30
代码如下:
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+




3 个解决方案

#1


没大师赐教吗?

#2


这是GDI+好不……
GDI的话分别用GetBitmapBits和GetObject获得位图数据和位图信息(数据是指各个像素点的颜色,信息是指宽高之类的东西)。
然后依次向文件写入BITMAPFILEHEADER、BITMAPINFOHEADER以及位图数据……
GDI+没怎么研究不敢妄下结论

#3


可以使用IPicture接口的SaveAsFile方法,具体代码自己百度一下。

#1


没大师赐教吗?

#2


这是GDI+好不……
GDI的话分别用GetBitmapBits和GetObject获得位图数据和位图信息(数据是指各个像素点的颜色,信息是指宽高之类的东西)。
然后依次向文件写入BITMAPFILEHEADER、BITMAPINFOHEADER以及位图数据……
GDI+没怎么研究不敢妄下结论

#3


可以使用IPicture接口的SaveAsFile方法,具体代码自己百度一下。