c#抓取网页数据( 具体分析如下实例分析C#操作图片的相关技巧(图))

优采云 发布时间: 2022-04-10 01:02

  c#抓取网页数据(

具体分析如下实例分析C#操作图片的相关技巧(图))

  C#方法抓取当前屏幕并保存为图片

  更新时间:2015-04-17 12:36:23 作者:work24

  本篇文章主要介绍了C#抓取当前屏幕并保存为图片的方法,并结合实例分析了C#操作图片的相关技巧,非常实用。有需要的朋友可以参考以下

  本文示例介绍了C#抓取当前屏幕并保存为图片的方法。分享给大家,供大家参考。具体分析如下:

  这是一个C#实现的截屏程序,可以截取整个屏幕并保存为指定格式的图片,并将当前控制台缓存保存为文本

  

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Diagnostics;

using System.Drawing;

using System.Drawing.Imaging;

using System.IO;

using System.Runtime.InteropServices;

using System.Text;

using System.Threading;

using System.Windows.Forms;

namespace RobvanderWoude

{

class PrintScreen

{

static int Main( string[] args )

{

try

{

string output = string.Empty;

bool overwrite = false;

bool text = false;

ImageFormat type = null;

#region Command Line parsing

if ( args.Length == 0 )

{

return WriteError( );

}

foreach ( string arg in args )

{

switch ( arg.ToUpper( ).Substring( 0, 2 ) )

{

case "/?":

return WriteError( );

case "/O":

overwrite = true;

break;

case "/T":

if ( text )

{

return WriteError( "Cannot capture current window as bitmap" );

}

switch ( arg.ToUpper( ).Substring( 3 ) )

{

case "BMP":

type = ImageFormat.Bmp;

break;

case "GIF":

type = ImageFormat.Gif;

break;

case "JPG":

case "JPEG":

type = ImageFormat.Jpeg;

break;

case "PNG":

type = ImageFormat.Png;

break;

case "TIF":

case "TIFF":

type = ImageFormat.Tiff;

break;

case "TXT":

text = true;

break;

default:

return WriteError( "Invalid file format: \"" + arg.Substring( 4 ) + "\"" );

}

break;

default:

output = arg;

break;

}

}

// Check if directory exists

if ( !Directory.Exists( Path.GetDirectoryName( output ) ) )

{

return WriteError( "Invalid path for output file: \"" + output + "\"" );

}

// Check if file exists, and if so, if it can be overwritten

if ( File.Exists( output ) )

{

if ( overwrite )

{

File.Delete( output );

}

else

{

return WriteError( "File exists; use /O to overwrite existing files." );

}

}

if ( type == null && text == false )

{

string ext = Path.GetExtension( output ).ToUpper( );

switch ( ext )

{

case ".BMP":

type = ImageFormat.Bmp;

break;

case ".GIF":

type = ImageFormat.Gif;

break;

case ".JPG":

case ".JPEG":

type = ImageFormat.Jpeg;

break;

case ".PNG":

type = ImageFormat.Png;

break;

case ".TIF":

case ".TIFF":

type = ImageFormat.Tiff;

break;

case ".TXT":

text = true;

break;

default:

return WriteError( "Invalid file type: \"" + ext + "\"" );

return 1;

}

}

#endregion Command Line parsing

if ( text )

{

string readtext = string.Empty;

for ( short i = 0; i < (short) Console.BufferHeight; i++ )

{

foreach ( string line in ConsoleReader.ReadFromBuffer( 0, i, (short) Console.BufferWidth, 1 ) )

{

readtext += line + "\n";

}

}

StreamWriter file = new StreamWriter( output );

file.Write( readtext );

file.Close( );

}

else

{

int width = Screen.PrimaryScreen.Bounds.Width;

int height = Screen.PrimaryScreen.Bounds.Height;

int top = 0;

int left = 0;

Bitmap printscreen = new Bitmap( width, height );

Graphics graphics = Graphics.FromImage( printscreen as Image );

graphics.CopyFromScreen( top, left, 0, 0, printscreen.Size );

printscreen.Save( output, type );

}

return 0;

}

catch ( Exception e )

{

Console.Error.WriteLine( e.Message );

return 1;

}

}

#region Error Handling

public static int WriteError( string errorMessage = "" )

{

Console.ResetColor( );

if ( string.IsNullOrEmpty( errorMessage ) == false )

{

Console.Error.WriteLine( );

Console.ForegroundColor = ConsoleColor.Red;

Console.Error.Write( "ERROR: " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.WriteLine( errorMessage );

Console.ResetColor( );

}

Console.Error.WriteLine( );

Console.Error.WriteLine( "PrintScreen, Version 1.10" );

Console.Error.WriteLine( "Save a screenshot as image or save the current console buffer as text" );

Console.Error.WriteLine( );

Console.Error.Write( "Usage: " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.WriteLine( "PRINTSCREEN outputfile [ /T:type ] [ /O ]" );

Console.ResetColor( );

Console.Error.WriteLine( );

Console.Error.Write( "Where: " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "outputfile" );

Console.ResetColor( );

Console.Error.WriteLine( " is the file to save the screenshot or text to" );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( " /T:type" );

Console.ResetColor( );

Console.Error.Write( " specifies the file type: " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "BMP" );

Console.ResetColor( );

Console.Error.Write( ", " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "GIF" );

Console.ResetColor( );

Console.Error.Write( ", " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "JPG" );

Console.ResetColor( );

Console.Error.Write( ", " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "PNG" );

Console.ResetColor( );

Console.Error.Write( ", " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "TIF" );

Console.ResetColor( );

Console.Error.Write( " or " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.WriteLine( "TXT" );

Console.ResetColor( );

Console.Error.Write( " (only required if " );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( "outputfile" );

Console.ResetColor( );

Console.Error.WriteLine( " extension is different)" );

Console.ForegroundColor = ConsoleColor.White;

Console.Error.Write( " /O" );

Console.ResetColor( );

Console.Error.WriteLine( " overwrites an existing file" );

Console.Error.WriteLine( );

Console.Error.Write( "Credits: Code to read console buffer by Simon Mourier " );

Console.ForegroundColor = ConsoleColor.DarkGray;

Console.Error.WriteLine( "http://www.sina.com.cn" );

Console.ResetColor( );

Console.Error.Write( " Code for graphic screenshot by Ali Hamdar " );

Console.ForegroundColor = ConsoleColor.DarkGray;

Console.Error.WriteLine( "https://www.jb51.net" );

Console.ResetColor( );

Console.Error.WriteLine( );

Console.Error.WriteLine( "Written by Rob van der Woude" );

Console.Error.WriteLine( "http://www.qq.com" );

return 1;

}

#endregion Error Handling

}

#region Read From Console Buffer

public class ConsoleReader

{

public static IEnumerable ReadFromBuffer( short x, short y, short width, short height )

{

IntPtr buffer = Marshal.AllocHGlobal( width * height * Marshal.SizeOf( typeof( CHAR_INFO ) ) );

if ( buffer == null )

throw new OutOfMemoryException( );

try

{

COORD coord = new COORD( );

SMALL_RECT rc = new SMALL_RECT( );

rc.Left = x;

rc.Top = y;

rc.Right = (short) ( x + width - 1 );

rc.Bottom = (short) ( y + height - 1 );

COORD size = new COORD( );

size.X = width;

size.Y = height;

const int STD_OUTPUT_HANDLE = -11;

if ( !ReadConsoleOutput( GetStdHandle( STD_OUTPUT_HANDLE ), buffer, size, coord, ref rc ) )

{

// 'Not enough storage is available to process this command' may be raised for buffer size > 64K (see ReadConsoleOutput doc.)

throw new Win32Exception( Marshal.GetLastWin32Error( ) );

}

IntPtr ptr = buffer;

for ( int h = 0; h < height; h++ )

{

StringBuilder sb = new StringBuilder( );

for ( int w = 0; w < width; w++ )

{

CHAR_INFO ci = (CHAR_INFO) Marshal.PtrToStructure( ptr, typeof( CHAR_INFO ) );

char[] chars = Console.OutputEncoding.GetChars( ci.charData );

sb.Append( chars[0] );

ptr += Marshal.SizeOf( typeof( CHAR_INFO ) );

}

yield return sb.ToString( );

}

}

finally

{

Marshal.FreeHGlobal( buffer );

}

}

[StructLayout( LayoutKind.Sequential )]

private struct CHAR_INFO

{

[MarshalAs( UnmanagedType.ByValArray, SizeConst = 2 )]

public byte[] charData;

public short attributes;

}

[StructLayout( LayoutKind.Sequential )]

private struct COORD

{

public short X;

public short Y;

}

[StructLayout( LayoutKind.Sequential )]

private struct SMALL_RECT

{

public short Left;

public short Top;

public short Right;

public short Bottom;

}

[StructLayout( LayoutKind.Sequential )]

private struct CONSOLE_SCREEN_BUFFER_INFO

{

public COORD dwSize;

public COORD dwCursorPosition;

public short wAttributes;

public SMALL_RECT srWindow;

public COORD dwMaximumWindowSize;

}

[DllImport( "kernel32.dll", SetLastError = true )]

private static extern bool ReadConsoleOutput( IntPtr hConsoleOutput, IntPtr lpBuffer, COORD dwBufferSize, COORD dwBufferCoord, ref SMALL_RECT lpReadRegion );

[DllImport( "kernel32.dll", SetLastError = true )]

private static extern IntPtr GetStdHandle( int nStdHandle );

}

#endregion Read From Console Buffer

}

  我希望这篇文章对你的 C# 编程有所帮助。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线