文件管理 · 2022年8月5日

gdi保存hdc为位图文件vb|在VB中怎样将PictureBox内显示的内容(包括里边的控件)保存为图片文件

『壹』 MFC中使用GDI 将矢量图转换成位图

可以将矢量图绘制到一个HDC上,然后将HDC中的bitmap保存到文件

『贰』 vb.NET 用GDI+画在PictureBox控件里的图怎么保存

'添加模块一个模块声明如下APIPublic Declare Function GdiTransparentBlt Lib "gdi32" (ByVal hdc1 As Long, ByVal x1 As Long, ByVal y1 As Long, ByVal W1 As Long, ByVal H1 As Long, ByVal Hdc2 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal W2 As Long, ByVal H2 As Long, ByVal Color As Long) As Long'hdc1 要绘图目标句柄'x1图片显示的横坐标位置'y1图片显示的纵坐标位置'w1图片缩放比例宽度'h1图片缩放比例高度'hdc2要绘制透明色的图片或控件(这里指picture)'x2一般这里填0(图片左上角起始坐标)'y2一般这里填0(图片左上角起始坐标)'w2图片宽度'h2图片高度'color绘制颜色(RGB(255,255,255)为透明色)'picture控件属性设置成visible=falseautosize=trueautoredraw=trueborderstyle=0窗体autoredraw=true简单例子Private Sub Form_Load()GdiTransparentBlt form1.hDC, 0, 0, form1.picture1.Width, form1.picture1.Height, form1.picture1.hDC, 0, 0, form1.picture1.Width, form1.picture1.Height, RGB(255, 255, 255) '画图End Sub

『叁』 在vb中自己做了个画图程序,图片是画在picture控件上的,请问如何保存图片为.jpg或其它格式。

savepicture picture1.picture,"c:\a.bmp"不可能不行的,VB6测试通过了先把Picture1.autoredraw设成true

『肆』 gdi+从文件读入图片再保存

GDI+画图是需要一个Graphic对象的,

读取到的Image对象,

初始化一个Graphic对象,

然后用这个Graphic对象画图。

第一种:用内存流去存储。using(MemoryStream ms = new MemoryStream()){image.Save(ms, ImageFormat.Jpeg);//图片保存格式image.save(filepath);//图片保存地址ms.dispose();//清空内存image.Dispose();//清空图片缓存}第二种:将内存流转换为字节数组保存,效率更高using(MemoryStream ms=new MemoryStream()){image.Save(ms, ImageFormat.Jpeg);byte[] Imgs = ms.ToArray();ms.Dispose();image.Dispose();System.IO.File.WriteAllBytes(filepath, Imgs);}

『伍』 vb中图片保存的问题

把一下代码复制到窗体中,点击Command1按钮就可以把名为Picture1的图片框内容保存为一个bmp图片。 Option Explicit Private Const BI_RGB = 0& Private Const DIB_RGB_COLORS = 0 ' color table in RGBs Private Const BITMAPTYPE As Integer = &H4D42 Private Const INVALID_HANDLE_VALUE = (-1) Private Const GENERIC_READ = &H80000000 Private Const GENERIC_WRITE = &H40000000 Private Const CREATE_ALWAYS = 2 Private Const FILE_ATTRIBUTE_NORMAL = &H80 Private Type BITMAPINFOHEADER '40 bytes biSize As Long biWidth As Long biHeight As Long biPlanes As Integer biBitCount As Integer biCompression As Long biSizeImage As Long biXPelsPerMeter As Long biYPelsPerMeter As Long biClrUsed As Long biClrImportant As Long End Type Private Type RGBQUAD rgbBlue As Byte rgbGreen As Byte rgbRed As Byte rgbReserved As Byte End Type Private Type BITMAPINFO bmiHeader As BITMAPINFOHEADER bmiColors As RGBQUAD End Type Private Type BITMAPFILEHEADER bfType As Integer bfSize As Long bfReserved1 As Integer bfReserved2 As Integer bfOffBits As Long End Type Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Sub Command1_Click() Dim dwWidth As Long Dim dwHeight As Long Dim hMemoryDC As Long Dim hMemoryBMP As Long Dim MemoryBMP_Info As BITMAPINFO Dim BMPFile_Info As BITMAPFILEHEADER Dim PicData() As Byte Dim AppDisk As String Dim hFile As Long Dim lpBytesWritten As Long Picture1.ScaleMode = 3 dwWidth = Picture1.ScaleWidth dwHeight = Picture1.ScaleHeight hMemoryDC = CreateCompatibleDC(Picture1.hdc) hMemoryBMP = CreateCompatibleBitmap(Picture1.hdc, dwWidth, dwHeight) SelectObject hMemoryDC, hMemoryBMP BitBlt hMemoryDC, 0, 0, dwWidth, dwHeight, Picture1.hdc, 0, 0, vbSrcCopy With MemoryBMP_Info.bmiHeader .biSize = LenB(MemoryBMP_Info.bmiHeader) .biWidth = dwWidth .biHeight = dwHeight .biPlanes = 1 .biBitCount = 32 '一个扫描行必须满足4字节的整数倍,所以这里取32位图就可以保证扫描行一定是4字节的整数倍 .biCompression = BI_RGB .biSizeImage = .biWidth * .biHeight * 4 End With ReDim PicData(1 To 4, 1 To dwWidth, 1 To dwHeight) As Byte GetDIBits hMemoryDC, hMemoryBMP, 0, dwHeight, PicData(1, 1, 1), MemoryBMP_Info, DIB_RGB_COLORS AppDisk = App.Path If Right$(AppDisk, 1) <> "\" Then AppDisk = AppDisk & "\" End If hFile = CreateFile(AppDisk & "PictureBox.bmp", GENERIC_READ Or GENERIC_WRITE, ByVal 0, ByVal 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0) If hFile <> INVALID_HANDLE_VALUE Then With BMPFile_Info .bfType = BITMAPTYPE .bfOffBits = 14 + MemoryBMP_Info.bmiHeader.biSize .bfSize = .bfOffBits + MemoryBMP_Info.bmiHeader.biSizeImage End With WriteFile hFile, BMPFile_Info.bfType, 2, lpBytesWritten, 0 WriteFile hFile, BMPFile_Info.bfSize, 12, lpBytesWritten, 0 WriteFile hFile, MemoryBMP_Info.bmiHeader, MemoryBMP_Info.bmiHeader.biSize, lpBytesWritten, 0 WriteFile hFile, PicData(1, 1, 1), MemoryBMP_Info.bmiHeader.biSizeImage, lpBytesWritten, 0 CloseHandle hFile End If DeleteObject hMemoryBMP DeleteDC hMemoryDC End Sub

『陆』 vb求截取区域屏幕图并保存为文件“`的代码

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As LongPrivate Declare Function ReleaseDC _ Lib "user32" (ByVal hwnd As Long, _ ByVal hdc As Long) As LongPrivate Declare Function BitBlt _ Lib "gdi32" (ByVal hDestDC As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal dwRop As Long) As LongPrivate Declare Function StretchBlt _ Lib "gdi32" (ByVal hdc As Long, _ ByVal X As Long, _ ByVal Y As Long, _ ByVal nWidth As Long, _ ByVal nHeight As Long, _ ByVal hSrcDC As Long, _ ByVal xSrc As Long, _ ByVal ySrc As Long, _ ByVal nSrcWidth As Long, _ ByVal nSrcHeight As Long, _ ByVal dwRop As Long) As Long'首先,在窗体上添加个图片框PictureBox控件Name为Picture1'截取指定位置指定大小的区域,保存到c:\1.bmp文件Private Sub Form_Load() Dim hDCtmp As Long Dim w, h, X, Y w = 300 ' 要截取屏幕部分的宽度 h = 300 ' 要截取屏幕部分的高度 X = 300 ' 横坐标 / 左边界 Left Y = 300 ' 纵坐标 / 上边界 Top Me.Hide hDCtmp = GetDC(0) Picture1.BorderStyle = 0 Picture1.AutoRedraw = True Picture1.Width = w * Screen.TwipsPerPixelX Picture1.Height = h * Screen.TwipsPerPixelY Call BitBlt(Picture1.hdc, 0, 0, w, h, hDCtmp, X, Y, vbSrcCopy) ReleaseDC 0, hDCtmp SavePicture Picture1.Image, "c:\1.bmp" Me.ShowEnd Sub

『柒』 [VB]关于GDI函数以及Image.hDC

image控件没有hdc属性,也就是说,这不是一个独立的控件,只是作为显示用的,和lable控件一样,不能作为容器,不能在上面作图,快速移动有闪烁等,但特点是占用内存少。它连hWnd属性也没有,更可况hdc属性了。

『捌』 在VB中怎样将PictureBox内显示的内容(包括里边的控件)保存为图片文件

在VB中将PictureBox内显示内容(包含里面加载的控件)保存为图片文件需要使用多个API函数来实现。被保存的图片是bmp格式的。

实现代码:

OptionExplicitPrivateConstBI_RGB=0&PrivateConstDIB_RGB_COLORS=0PrivateConstBITMAPTYPE=&H4D42PrivateConstINVALID_HANDLE_VALUE=(-1)PrivateConstGENERIC_WRITE=&H40000000PrivateConstCREATE_ALWAYS=2PrivateTypeBITMAPINFOHEADER'40bytesbiSizeAsLongbiWidthAsLongbiHeightAsLongbiPlanesAsIntegerbiBitCountAsIntegerbiCompressionAsLongbiSizeImageAsLongbiXPelsPerMeterAsLongbiYPelsPerMeterAsLongbiClrUsedAsLongbiClrImportantAsLongEndTypePrivateConstFILE_ATTRIBUTE_NORMAL=&H80PrivateTypeRGBQUADrgbBlueAsBytergbGreenAsBytergbRedAsBytergbReservedAsByteEndTypePrivateTypeBITMAPINFObmiHeaderAsBITMAPINFOHEADERbmiColorsAsRGBQUADEndTypePrivateTypeBITMAPFILEHEADERbfTypeAsIntegerbfSizeAsLongbfReserved1AsIntegerbfReserved2AsIntegerbfOffBitsAsLongEndType"gdi32"(ByValhdcAsLong)AsLong"gdi32"(ByValhdcAsLong,pBitmapInfoAsBITMAPINFO,ByValunAsLong,lplpVoidAsLong,ByValhandleAsLong,ByValdwAsLong)AsLong"gdi32"(ByValhdcAsLong,ByValhObjectAsLong)AsLong"gdi32"(ByValhDestDCAsLong,ByValxAsLong,ByValyAsLong,ByValnWidthAsLong,ByValnHeightAsLong,ByValhSrcDCAsLong,ByValxSrcAsLong,ByValySrcAsLong,ByValdwRopAsLong)AsLong"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,,,,ByValhTemplateFileAsLong)AsLong"kernel32"(ByValhFileAsLong,lpBufferAsAny,,lpNumberOfBytesWrittenAsLong,ByVallpOverlappedAsLong)AsLong"kernel32"(ByValhObjectAsLong)AsLong"gdi32"(ByValhObjectAsLong)AsLong"gdi32"(ByValhdcAsLong)AsLongPrivateSubCmdSave_Click()'保存转换后的图像DimhmemDCAsLongDimhmemBMPAsLongDimlpmemBitsAsLongDimbmp_infoAsBITMAPINFODimhFileAsLongDimbmpfile_infoAsBITMAPFILEHEADERDimlpBytesWrittenAsLongPicture1.ScaleMode=vbPixelsWithbmp_info.bmiHeader.biSize=LenB(bmp_info.bmiHeader).biWidth=Picture1.ScaleWidth.biHeight=Picture1.ScaleHeight.biPlanes=1.biBitCount=24.biCompression=BI_RGB.biSizeImage=.biHeight*(((.biWidth*.biBitCount+31)And&HFFFFFFE0)8)EndWithhmemDC=CreateCompatibleDC(Picture1.hdc)hmemBMP=CreateDIBSection(Picture1.hdc,bmp_info,DIB_RGB_COLORS,lpmemBits,0,0)SelectObjecthmemDC,hmemBMPBitBlthmemDC,0,0,bmp_info.bmiHeader.biWidth,bmp_info.bmiHeader.biHeight,Picture1.hdc,0,0,vbSrcCopy'保存图片hFile=CreateFile(App.Path&" est.bmp",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)IfhFile<>INVALID_HANDLE_VALUEThenWithbmpfile_info.bfType=BITMAPTYPE.bfOffBits=14+bmp_info.bmiHeader.biSize.bfSize=.bfOffBits+bmp_info.bmiHeader.biSizeImageEndWithWriteFilehFile,bmpfile_info.bfType,2,lpBytesWritten,0WriteFilehFile,bmpfile_info.bfSize,12,lpBytesWritten,0WriteFilehFile,bmp_info.bmiHeader,bmp_info.bmiHeader.biSize,lpBytesWritten,0WriteFilehFile,ByVallpmemBits,bmp_info.bmiHeader.biSizeImage,lpBytesWritten,0CloseHandlehFileEndIfDeleteObjecthmemBMPDeleteDChmemDCEndSub

『玖』 VB 如何将数组保存为图像

楼主,光有“图像数据”还不够的,还要有“图像宽度和高度”这两个参数信息,和“色深信息” 才行。并且,在VB6.0中,你的“三维数组”不能直接使用,还得转换成“一维”的数组数据。因为VB6.0用的数组是“安全数组”,它的各维存储顺序跟系统中用到的“真数组”不兼容的。有了我前面说的那些“信息”后,并且把数据格式转换后,就可以用GDI+的一系列API来处理了,不用再通过PictureBox,这样图片的尺寸大小(宽度或高度),基本上不受限制了。

『拾』 VB图像保存程序代码

因为默认的保存无论你选择什么格式后缀,其实都是bmp位图,你看文件尺寸就知道了。

通常保存图片代码:(默认pictrebox名称)

dim filepath as string

SavePicture Picture1.Image,filepath

当然,filepath路径的获得你可以用对话框确定一下。

我要给你的代码是可以保存多种格式的。需要添加一个模块,模块代码最后贴

调用示范:

'先正常保存文件DimfileStrAsStringfileStr=App.Path&" empmymp.gif"'定义临时文件,并检查是否有同名文件,有则清除IfDir(fileStr)<>""ThenKillfileStrSavePicturePicture1.Image,fileStr'再转换格式,这里转成gifDimstdpicAsStdPictureSetstdpic=LoadPicture(fileStr)CallSavePic(stdpic,fileStr,".gif")Setstdpic=Nothing'模块代码:PrivateTypeGUIDData1AsLongData2AsIntegerData3AsIntegerData4(0To7)AsByteEndTypeGdiplusVersionAsLongDebugEventCallbackAsLongSuppressExternalCodecsAsLongEndTypePrivateTypeEncoderParameterGUIDAsGUIDNumberOfValuesAsLongtypeAsLongValueAsLongEndTypePrivateTypeEncoderParameterscountAsLongParameterAsEncoderParameterEndType"GDIPlus"(tokenAsLong,inputbufAsGdiplusStartupInput,OptionalByValoutputbufAsLong=0)AsLong"GDIPlus"(ByValtokenAsLong)AsLong"GDIPlus"(ByValhbmAsLong,ByValhPalAsLong,BITMAPAsLong)AsLong"GDIPlus"(ByValImageAsLong)AsLong"GDIPlus"(ByValImageAsLong,ByValFileNameAsLong,clsidEncoderAsGUID,encoderParamsAsAny)AsLong"ole32"(ByValStrAsLong,idAsGUID)AsLong"kernel32"Alias"RtlMoveMemory"(DestAsAny,SrcAsAny,ByValcbAsLong)AsLong'*************************************************************************'**作者:laviewpbt'**函数名:SavePic'**输入:pic(StdPicture)-图象句柄'**:FileName(String)-保存路径'**:Quality(Byte)-JPG图象质量'**:TIFF_ColorDepth(Long)-TTF格式的颜色深度'**:TIFF_Compression(Long)-TTF格式的压缩比'**输出:无'**功能描述:把图象保存为JPG、TIFF、PNG、GIF、BMP格式'**日期:'**修改人:laviewpbt'**日期:2005-10-2314.43.52'**版本:Version1.2.1'*************************************************************************PublicSubSavePic(ByValpictAsStdPicture,ByValFileNameAsString,PicTypeAsString,_OptionalByValQualityAsByte=80,_OptionalByValTIFF_ColorDepthAsLong=24,_OptionalByValTIFF_CompressionAsLong=6)Screen.MousePointer=vbHourglassDimtSIAsGdiplusStartupInputDimlResAsLongDimlGDIPAsLongDimlBitmapAsLongDimaEncParams()AsByteOnErrorGoToErrHandle:tSI.GdiplusVersion=1'初始化GDI+lRes=GdiplusStartup(lGDIP,tSI)IflRes=0Then'从句柄创建GDI+图像lRes=GdipCreateBitmapFromHBITMAP(pict.Handle,0,lBitmap)IflRes=0ThenDimtJpgEncoderAsGUIDDimtParamsAsEncoderParameters'初始化解码器的GUID标识SelectCasePicTypeCase".jpg"CLSIDFromStringStrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"),tJpgEncodertParams.count=1'设置解码器参数WithtParams.Parameter'QualityCLSIDFromStringStrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"),.GUID'得到Quality参数的GUID标识.NumberOfValues=1.type=4.Value=VarPtr(Quality)EndWithReDimaEncParams(1ToLen(tParams))CallCopyMemory(aEncParams(1),tParams,Len(tParams))Case".png"CLSIDFromStringStrPtr("{557CF406-1A04-11D3-9A73-0000F81EF32E}"),tJpgEncoderReDimaEncParams(1ToLen(tParams))Case".gif"CLSIDFromStringStrPtr("{557CF402-1A04-11D3-9A73-0000F81EF32E}"),tJpgEncoderReDimaEncParams(1ToLen(tParams))Case".tiff"CLSIDFromStringStrPtr("{557CF405-1A04-11D3-9A73-0000F81EF32E}"),tJpgEncodertParams.count=2ReDimaEncParams(1ToLen(tParams)+Len(tParams.Parameter))WithtParams.Parameter.NumberOfValues=1.type=4CLSIDFromStringStrPtr("{E09D739D-CCD4-44EE-8EBA-3FBF8BE4FC58}"),.GUID'得到ColorDepth参数的GUID标识.Value=VarPtr(TIFF_Compression)EndWithCallCopyMemory(aEncParams(1),tParams,Len(tParams))WithtParams.Parameter.NumberOfValues=1.type=4CLSIDFromStringStrPtr("{66087055-AD66-4C7C-9A18-38A2310B8337}"),.GUID'得到Compression参数的GUID标识.Value=VarPtr(TIFF_ColorDepth)EndWithCallCopyMemory(aEncParams(Len(tParams)+1),tParams.Parameter,Len(tParams.Parameter))Case".bmp"'可以提前写保存为BMP的代码,因为并没有用GDI+SavePicturepict,FileNameScreen.MousePointer=vbDefaultExitSubEndSelectlRes=GdipSaveImageToFile(lBitmap,StrPtr(FileName),tJpgEncoder,aEncParams(1))'保存图像GdipDisposeImagelBitmap'销毁GDI+图像EndIfGdiplusShutdownlGDIP'销毁GDI+EndIfScreen.MousePointer=vbDefaultEraseaEncParamsExitSubErrHandle:Screen.MousePointer=vbDefaultMsgBox"在保存图片的过程中发生错误:"&vbCrLf&vbCrLf&"错误号:"&Err.Number&vbCrLf&"错误描述:"&Err.Description,vbInformationOrvbOKOnly,"错误"EndSub