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+没怎么研究不敢妄下结论
GDI的话分别用GetBitmapBits和GetObject获得位图数据和位图信息(数据是指各个像素点的颜色,信息是指宽高之类的东西)。
然后依次向文件写入BITMAPFILEHEADER、BITMAPINFOHEADER以及位图数据……
GDI+没怎么研究不敢妄下结论
#3
可以使用IPicture接口的SaveAsFile方法,具体代码自己百度一下。
#1
没大师赐教吗?
#2
这是GDI+好不……
GDI的话分别用GetBitmapBits和GetObject获得位图数据和位图信息(数据是指各个像素点的颜色,信息是指宽高之类的东西)。
然后依次向文件写入BITMAPFILEHEADER、BITMAPINFOHEADER以及位图数据……
GDI+没怎么研究不敢妄下结论
GDI的话分别用GetBitmapBits和GetObject获得位图数据和位图信息(数据是指各个像素点的颜色,信息是指宽高之类的东西)。
然后依次向文件写入BITMAPFILEHEADER、BITMAPINFOHEADER以及位图数据……
GDI+没怎么研究不敢妄下结论
#3
可以使用IPicture接口的SaveAsFile方法,具体代码自己百度一下。