Page2Image.vb
上传用户:szledliu
上传日期:2021-01-29
资源大小:13805k
文件大小:10k
源码类别:

C#编程

开发平台:

C#

  1. Imports System
  2. Imports System.Drawing
  3. Imports System.Collections
  4. Imports System.ComponentModel
  5. Imports System.Windows.Forms
  6. Imports System.Data
  7. Imports System.Text
  8. Imports System.Runtime.InteropServices
  9. Imports System.Diagnostics
  10. Imports System.IO
  11. Imports System.Drawing.Imaging
  12. Public Class Page2Image
  13.     <DllImport("user32.dll", CharSet:=CharSet.Auto)> _
  14.     Public Shared Function FindWindowEx(ByVal parent As IntPtr, ByVal [next] As IntPtr, ByVal sClassName As String, ByVal sWindowTitle As IntPtr) As IntPtr
  15.     End Function
  16.     <DllImport("user32.dll", ExactSpelling:=True, CharSet:=CharSet.Auto)> _
  17.     Public Shared Function GetWindow(ByVal hWnd As IntPtr, ByVal uCmd As Integer) As IntPtr
  18.     End Function
  19.     <DllImport("user32.Dll")> _
  20.     Public Shared Sub GetClassName(ByVal h As Integer, ByVal s As StringBuilder, ByVal nMaxCount As Integer)
  21.     End Sub
  22.     <DllImport("user32.dll")> _
  23.     Private Shared Function PrintWindow(ByVal hwnd As IntPtr, ByVal hdcBlt As IntPtr, ByVal nFlags As UInteger) As Boolean
  24.     End Function
  25.     Public Const GW_CHILD As Integer = 5
  26.     Public Const GW_HWNDNEXT As Integer = 2
  27.     Public Function CapturePage(ByVal oDoc As HtmlDocument) As Image
  28.         Try
  29.             'URL Location
  30.             Dim chkShowGuides As Boolean = False
  31.             Dim myLocalLink As String = oDoc.Url.ToString
  32.             Dim URLExtraHeight As Integer = 0
  33.             Dim URLExtraLeft As Integer = 0
  34.             'Adjustment variable for capture size.
  35.             'If chkWriteURL.Checked = True Then
  36.             '    URLExtraHeight = 25
  37.             'End If
  38.             'TrimHeight and TrimLeft trims off some captured IE graphics.
  39.             Dim trimHeight As Integer = 3
  40.             Dim trimLeft As Integer = 3
  41.             'Use UrlExtra height to carry trimHeight.
  42.             URLExtraHeight = URLExtraHeight - trimHeight
  43.             URLExtraLeft = URLExtraLeft - trimLeft
  44.             oDoc.Body.SetAttribute("scroll", "yes")
  45.             'Get Browser Window Height
  46.             Dim heightsize As Integer = CInt(oDoc.Body.GetAttribute("scrollHeight"))
  47.             Dim widthsize As Integer = CInt(oDoc.Body.GetAttribute("scrollWidth"))
  48.             'Get Screen Height
  49.             Dim screenHeight As Integer = CInt(oDoc.Body.GetAttribute("clientHeight"))
  50.             Dim screenWidth As Integer = CInt(oDoc.Body.GetAttribute("clientWidth"))
  51.             'Get bitmap to hold screen fragment.
  52.             Dim bm As New Bitmap(screenWidth, screenHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555)
  53.             'Create a target bitmap to draw into.
  54.             Dim bm2 As New Bitmap(widthsize + URLExtraLeft, heightsize + URLExtraHeight - trimHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555)
  55.             Dim g2 As Graphics = Graphics.FromImage(bm2)
  56.             Dim g As Graphics = Nothing
  57.             Dim hdc As IntPtr
  58.             Dim screenfrag As Image = Nothing
  59.             Dim brwTop As Integer = 0
  60.             Dim brwLeft As Integer = 0
  61.             Dim myPage As Integer = 0
  62.             Dim myIntptr As IntPtr = DirectCast(AppManager.CurrentBrowser.Handle, IntPtr)
  63.             'Get inner browser window.
  64.             Dim hwndInt As Integer = myIntptr.ToInt32()
  65.             Dim hwnd As IntPtr = myIntptr
  66.             hwnd = GetWindow(hwnd, GW_CHILD)
  67.             Dim sbc As New StringBuilder(256)
  68.             'Get Browser "Document" Handle
  69.             While hwndInt <> 0
  70.                 hwndInt = hwnd.ToInt32()
  71.                 GetClassName(hwndInt, sbc, 256)
  72.                 If sbc.ToString().IndexOf("Shell DocObject View", 0) > -1 Then
  73.                     hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Internet Explorer_Server", IntPtr.Zero)
  74.                     Exit While
  75.                 End If
  76.                 hwnd = GetWindow(hwnd, GW_HWNDNEXT)
  77.             End While
  78.             'Get Screen Height (for bottom up screen drawing)
  79.             While (myPage * screenHeight) < heightsize
  80.                 oDoc.Body.SetAttribute("scrollTop", (screenHeight - 5) * myPage)
  81.                 myPage += 1
  82.             End While
  83.             'Rollback the page count by one
  84.             myPage -= 1
  85.             Dim myPageWidth As Integer = 0
  86.             While (myPageWidth * screenWidth) < widthsize
  87.                 oDoc.Body.SetAttribute("scrollLeft", (screenWidth - 5) * myPageWidth)
  88.                 brwLeft = CInt(oDoc.Body.GetAttribute("scrollLeft"))
  89.                 For i As Integer = myPage To 0 Step -1
  90.                     'Shoot visible window
  91.                     g = Graphics.FromImage(bm)
  92.                     hdc = g.GetHdc()
  93.                     oDoc.Body.SetAttribute("scrollTop", (screenHeight - 5) * i)
  94.                     brwTop = CInt(oDoc.Body.GetAttribute("scrollTop"))
  95.                     PrintWindow(hwnd, hdc, 0)
  96.                     g.ReleaseHdc(hdc)
  97.                     g.Flush()
  98.                     screenfrag = Image.FromHbitmap(bm.GetHbitmap())
  99.                     g2.DrawImage(screenfrag, brwLeft + URLExtraLeft, brwTop + URLExtraHeight)
  100.                 Next
  101.                 myPageWidth += 1
  102.             End While
  103.             'Draw Standard Resolution Guides
  104.             If chkShowGuides = True Then
  105.                 ' Create pen.
  106.                 Dim myWidth As Integer = 1
  107.                 Dim myPen As New Pen(Color.Navy, myWidth)
  108.                 Dim myShadowPen As New Pen(Color.NavajoWhite, myWidth)
  109.                 ' Create coordinates of points that define line.
  110.                 Dim x1 As Single = -CSng(myWidth) - 1 + URLExtraLeft
  111.                 Dim y1 As Single = -CSng(myWidth) - 1 + URLExtraHeight
  112.                 Dim x600 As Single = 600.0F + CSng(myWidth) + 1
  113.                 Dim y480 As Single = 480.0F + CSng(myWidth) + 1
  114.                 Dim x2 As Single = 800.0F + CSng(myWidth) + 1
  115.                 Dim y2 As Single = 600.0F + CSng(myWidth) + 1
  116.                 Dim x3 As Single = 1024.0F + CSng(myWidth) + 1
  117.                 Dim y3 As Single = 768.0F + CSng(myWidth) + 1
  118.                 Dim x1280 As Single = 1280.0F + CSng(myWidth) + 1
  119.                 Dim y1024 As Single = 1024.0F + CSng(myWidth) + 1
  120.                 ' Draw line to screen.
  121.                 g2.DrawRectangle(myPen, x1, y1, x600 + myWidth, y480 + myWidth)
  122.                 g2.DrawRectangle(myPen, x1, y1, x2 + myWidth, y2 + myWidth)
  123.                 g2.DrawRectangle(myPen, x1, y1, x3 + myWidth, y3 + myWidth)
  124.                 g2.DrawRectangle(myPen, x1, y1, x1280 + myWidth, y1024 + myWidth)
  125.                 ' Create font and brush.
  126.                 Dim drawFont As New Font("Arial", 12)
  127.                 Dim drawBrush As New SolidBrush(Color.Navy)
  128.                 Dim drawBrush2 As New SolidBrush(Color.NavajoWhite)
  129.                 ' Set format of string.
  130.                 Dim drawFormat As New StringFormat()
  131.                 drawFormat.FormatFlags = StringFormatFlags.FitBlackBox
  132.                 ' Draw string to screen.
  133.                 g2.DrawString("600 x 480", drawFont, drawBrush, 5, y480 - 20 + URLExtraHeight, drawFormat)
  134.                 g2.DrawString("800 x 600", drawFont, drawBrush, 5, y2 - 20 + URLExtraHeight, drawFormat)
  135.                 g2.DrawString("1024 x 768", drawFont, drawBrush, 5, y3 - 20 + URLExtraHeight, drawFormat)
  136.                 g2.DrawString("1280 x 1024", drawFont, drawBrush, 5, y1024 - 20 + URLExtraHeight, drawFormat)
  137.             End If
  138.             Dim chkWriteURL As Boolean = True
  139.             'Write URL
  140.             If chkWriteURL = True Then
  141.                 'Backfill URL paint location
  142.                 Dim whiteBrush As New SolidBrush(Color.White)
  143.                 Dim fillRect As New Rectangle(0, 0, widthsize, URLExtraHeight + 2)
  144.                 Dim fillRegion As New Region(fillRect)
  145.                 g2.FillRegion(whiteBrush, fillRegion)
  146.                 Dim drawBrushURL As New SolidBrush(Color.Black)
  147.                 Dim drawFont As New Font("Arial", 12)
  148.                 Dim drawFormat As New StringFormat()
  149.                 drawFormat.FormatFlags = StringFormatFlags.FitBlackBox
  150.                 g2.DrawString(myLocalLink, drawFont, drawBrushURL, 0, 0, drawFormat)
  151.             End If
  152.             'Reduce Resolution Size
  153.             Dim myResolution As Double = Convert.ToDouble(100) * 0.01 'Convert.ToDouble(cmbResolution.Text) * 0.01
  154.             Dim finalWidth As Integer = CInt(((widthsize + URLExtraLeft) * myResolution))
  155.             Dim finalHeight As Integer = CInt(((heightsize + URLExtraHeight) * myResolution))
  156.             Dim finalImage As New Bitmap(finalWidth, finalHeight, System.Drawing.Imaging.PixelFormat.Format16bppRgb555)
  157.             Dim gFinal As Graphics = Graphics.FromImage(DirectCast(finalImage, Image))
  158.             gFinal.DrawImage(bm2, 0, 0, finalWidth, finalHeight)
  159.             'Get Time Stamp
  160.             Dim myTime As DateTime = DateTime.Now
  161.             Dim format As String = "MM.dd.hh.mm.ss"
  162.             'Create Directory to save image to.
  163.             Directory.CreateDirectory("C:IECapture")
  164.             'Write Image.
  165.             Dim eps As New EncoderParameters(1)
  166.             Dim myQuality As Long = Convert.ToInt64(100) 'Convert.ToInt64(cmbQuality.Text)
  167.             eps.Param(0) = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, myQuality)
  168.             Dim ici As ImageCodecInfo = GetEncoderInfo("image/jpeg")
  169.             'finalImage.Save("c:\IECaptureCaptured_" + myTime.ToString(format) + ".jpg", ici, eps)
  170.             Return finalImage
  171.             'Clean Up.
  172.             'myDoc = Nothing
  173.             g.Dispose()
  174.             g2.Dispose()
  175.             gFinal.Dispose()
  176.             bm.Dispose()
  177.             bm2.Dispose()
  178.             'finalImage.Dispose()
  179.             Cursor.Current = Cursors.[Default]
  180.         Catch ex As Exception
  181.             Dim ofrm As New frmError
  182.             ofrm.err = ex
  183.             ofrm.Show()
  184.             Return Nothing
  185.         End Try
  186.     End Function
  187.     Private Shared Function GetEncoderInfo(ByVal mimeType As String) As ImageCodecInfo
  188.         Dim j As Integer
  189.         Dim encoders As ImageCodecInfo()
  190.         encoders = ImageCodecInfo.GetImageEncoders()
  191.         For j = 0 To encoders.Length - 1
  192.             If encoders(j).MimeType = mimeType Then
  193.                 Return encoders(j)
  194.             End If
  195.         Next
  196.         Return Nothing
  197.     End Function
  198. End Class