Quelltext einer Webseite mit C# auslesen
Mit dem folgenden kleinen Snippet könnt ihr den Quelltext einer Webseite auslesen und in einem string speichern.
Solch eine Funktion eignet sich zum Beispiel, wenn man einzelne Informationen aus einer Webseite parsen und anderweitig benutzen will.
Damit das Snippet funktioniert, müsst ihr eurem Quelltext folgende beide Using-Direktiven hinzufügen.
using System.Net; using System.IO; //Snippet von www.code-bude.net
Die Funktion zum Download des Quelltextes sieht dann wie folgt aus:
public string getHTML(string url)
{
//Anfrage an die Übergebene URL starten
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
//Antwort-Objekt erstellen
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//Antwort Stream an Streamreader übergeben
StreamReader sr = new StreamReader(response.GetResponseStream());
//Antwort (HTML Code) auslesen
string html = sr.ReadToEnd();
//Streamreader und Webanfrage schließen
sr.Close();
response.Close();
//Quellcode zurückgeben
return html;
}
//Snippet von www.code-bude.net
Ein Aufruf der Funktion könnte zum Beispiel so aussehen:
getHTML("http://www.code-bude.net");
//Snippet von www.code-bude.net
Solltet ihr Verbesserungsvorschläge oder sogar Probleme mit dem Snippet haben, schreibt mir einen Kommentar.
Viele Grüße,
Raffi
Emails versenden in C#
Heute zeige ich euch, wie man ganz einfach Emails in C# verschicken kann. Alles, was benötigt wird, bringt die Klasse System.Net.Mail mit sich.
Um nachher Email mittels des Snippets verschicken zu können benötigt ihr lediglich die Adresse eines SMTP-Servers und gegebenen Falls die Zugangsdaten für diesen. (Offene, sprich registrierungsfreie Server, werdet ihr heutzutage kaum noch finden.)
Wie die Adresse des SMTP-Servers eures Anbieters lautet erfragt/ergoogelt ihr euch am besten auf den Seiten eures Anbieters oder ihr schaut mal in eine dieser drei Listen ([1] [2] [3]).
Habt ihr alle nötigen Zugangsdaten parat, kann es auch schon losgehen.
public void sendMail(string absender, string empfaenger,
string betreff, string nachricht,
string server, int port,
string user, string passwort)
{
MailMessage Email = new MailMessage();
//Absender konfigurieren
Email.From = new MailAddress(absender);
//Empfänger konfigurieren
Email.To.Add(empfaenger);
//Betreff einrichten
Email.Subject = betreff;
//Hinzufügen der eigentlichen Nachricht
Email.Body = nachricht;
//Ausgangsserver initialisieren
SmtpClient MailClient = new SmtpClient(server,port);
if (user.Length > 0 && user != string.Empty)
{
//Login konfigurieren
MailClient.Credentials = new System.Net.NetworkCredential(
user, passwort);
}
//Email absenden
MailClient.Send(Email);
}
//Snippet von www.code-bude.net
Ein Aufruf der Funktion könnte zum Beispiel wie folgt aussehen.
sendMail("raffiausgoslar2@arcor.de", "info@wortkonstrukte.net",
"test email", "Hallo Jose. Diese Mail wird per C# gesendet!",
"mail.arcor.de", 25,
"raffiausgoslar2", "meinGeheimesPasswort");
//Snippet von www.code-bude.net
Solltet ihr noch Fragen oder Tipps haben, so schreibt mir doch bitte einen Kommentar.
Viele Grüße,
Raffi
Pex for fun – ein Programmierspiel für Windowsliebhaber
Ich bin da gerade mal wieder über eine herrliche Webseite gestolpert, die ich euch nicht vorenthalten möchte.
Darauf aufmerksam geworden bin ich durch Herbivores Post in diesem Thread.
Bei der Webseite handelt es sich um www.pexforfun.com, auf der ihr etliche mehr oder weniger schwere Programmierrätsel lösen könnt. Bei der zu benutzenden Programmiersprache habt ihr die Wahl zwischen C#, F# und Visual Basic.
Die Rätsel sind alle auf der gleichen Basis aufgebaut. Es ist eine Funktion namens Puzzle vorgegeben, die einen oder mehrere Parameter annimmt und einen Rückgabewert hat. Was die Funktion machen soll, müsst ihr herausfinden. Dabei steht euch eine Variante von Pex zur Verfügung. (Pex ist ein Tool zum Unit-Testing nach dem Whitebox-Verfahren, welches von Microsoft Research entwickelt wird.)
Zu Beginn ist es sinnvoll, erst einmal den “Ask Pex”-Button zu drücken. Pex generiert dann ein paar mögliche Werte für den/die Parameter der Funktion und zeigt euch an, was eure Funktion ausgeben würde und was für ein Wert eigentlich erwartet wird. So könnt ihr euch nach und nach an die richtige Funktion tasten. Das kann manchmal ganz schön knifflig sein, macht aber in der Regel eine Menge Spaß. Also probiert es doch selber mal aus.
Für die ganz Eifrigen gibt es das Ganze auch noch als App für Windows Phone 7 Geräte.
Und nun wünsche ich euch viel Spaß beim Knobeln. Solltet ihr die Seite schon kennen oder sogar ein eigenes Rätsel erstellt haben, so verlinkt es doch einfach in einem Kommentar unter diesem Beitrag.
Viele Grüße,
Raffi
Bilder mit JPEG beliebig komprimieren in C#
Heute zeige ich euch, wie man Bilder mit Hilfe des JPEG-Codecs beliebig komprimieren kann. Beliebig heißt in unserem Fall, dass ihr die Qualitätsstufe festlegen könnt, die das Bild trotz des Komprimierens beibehalten soll. Da die Funktion, die ich euch dafür geschrieben habe relativ kurz ist, denke ich, dass die Kommentare im Quelltext ausreichen sollten. Und nun viel Spaß damit!
private void JpegBildKomprimieren(Image quellBild, int qualitaet, string speicherPfad)
{
try
{
//Ein ImageCodecInfo-Objekt für den JPEG-Codec anlegen
ImageCodecInfo jpegCodec = null;
//Den Qualitätsarameter konfigurieren (Qualitätsfaktor in
//Prozent angeben)
EncoderParameter qualitaetsParameter = new EncoderParameter(
System.Drawing.Imaging.Encoder.Quality, qualitaet);
//Alle im System verfügbaren Codecs auflisten
ImageCodecInfo[] alleCodecs = ImageCodecInfo.GetImageEncoders();
EncoderParameters codecParameter = new EncoderParameters(1);
codecParameter.Param[0] = qualitaetsParameter;
//Den JPEG-Codec unter allen Codecs finden und dem
//Codec-Info-Objekt zuweisen
for (int i = 0; i < alleCodecs.Length; i++)
{
if (alleCodecs[i].MimeType == "image/jpeg")
{
jpegCodec = alleCodecs[i];
break;
}
}
//Das Bild abspeichern
quellBild.Save(speicherPfad, jpegCodec, codecParameter);
}
catch (Exception e)
{
throw e;
}
}
//Snippet von www.code-bude.net
Aufgerufen werden kann die Funktion zum Beispiel wie folgt:
JpegBildKomprimieren(Image.FromFile(Application.StartupPath + "\\bild.jpg"),
30, Application.StartupPath + "\\klein.jpg");
//Snippet von www.code-bude.net
Solltet ihr noch Fragen oder Probleme haben, so schreibt mir einfach einen Kommentar.
Viele Grüße,
Raffi
Webcam benutzen in C#
Wie steuert man am besten und einfachsten eine Webcam unter Benutzung von C#.Net an? Recherchiert man im Internet, wird man, sofern man überhaupt fündig wird, leider oftmals mit sehr langen Artikeln und unübersichtlichen Snippets konfrontiert. Doch das muss gar nicht sein, denn mit Hilfe der AForge.NET Library geht das ganz einfach. Und wie das genau geht, möchte ich euch im Folgenden Artikel zeigen.
Was wird für dieses Tutorial benötigt?
- Die AForge.Video.dll, sowie die AForge.Video.DirectShow.dll
Beide Dlls findet ihr auf der AForge Downloadseite im “(libs only)” zip-Archiv. - Eine schlichte WinForms-Anwendung, auf der ihr schon mal eine Picturebox anlegt.
Zuerst bindet ihr die beiden oben genannten Dlls als Referenzen ein. (Ich gehe an dieser Stelle einfach mal davon aus, dass ihr irgend eine Version des Microsoft Visual Studios für die Entwicklung nutzt. Bei anderen IDEs dürfte dieser Schritt jedoch ähnlich sein.)
Bevor wir zum Quellcode kommen, müsst ihr nur noch zwei Eventhandler anlegen. Einen für das FormLoad-Event und einen für das FormClosed-Event. (Am einfachsten geht dies direkt über den Designer des Visual Studios.)
Der Rest erklärt sich über den nachfolgenden Quelltext und dessen Kommentare.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
//Anlegen von Using-Direktiven für einfacheren Zugriff auf die
//benötigten Methoden der AForge Library
using AForge.Video;
using AForge.Video.DirectShow;
namespace aforgeWebcamTutorial
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//Anlegen eines Webcam-Objektes
VideoCaptureDevice videoSource;
private void Form1_Load(object sender, EventArgs e)
{
//Anlegen einer Liste mit allen Videoquellen. (Hier können neben der gewünschten Webcam
//auch TV-Karten, etc. auftauchen)
FilterInfoCollection videosources = new FilterInfoCollection(FilterCategory.VideoInputDevice);
//Überprüfen, ob mindestens eine Aufnahmequelle vorhanden ist
if (videosources != null)
{
//Die erste Aufnahmequelle an unser Webcam Objekt binden
//(habt ihr mehrere Quellen, muss nicht immer die erste Quelle die
//gewünschte Webcam sein!)
videoSource = new VideoCaptureDevice(videosources[0].MonikerString);
try
{
//Überprüfen ob die Aufnahmequelle eine Liste mit möglichen Aufnahme-
//Auflösungen mitliefert.
if (videoSource.VideoCapabilities.Length > 0)
{
string highestSolution = "0;0";
//Das Profil mit der höchsten Auflösung suchen
for (int i = 0; i < videoSource.VideoCapabilities.Length; i++)
{
if (videoSource.VideoCapabilities[i].FrameSize.Width > Convert.ToInt32(highestSolution.Split(';')[0]))
highestSolution = videoSource.VideoCapabilities[i].FrameSize.Width.ToString() + ";" + i.ToString();
}
//Dem Webcam Objekt ermittelte Auflösung übergeben
videoSource.DesiredFrameSize = videoSource.VideoCapabilities[Convert.ToInt32(highestSolution.Split(';')[1])].FrameSize;
}
}
catch { }
//NewFrame Eventhandler zuweisen anlegen.
//(Dieser registriert jeden neuen Frame der Webcam)
videoSource.NewFrame += new AForge.Video.NewFrameEventHandler(videoSource_NewFrame);
//Das Aufnahmegerät aktivieren
videoSource.Start();
}
}
void videoSource_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs)
{
//Jedes ankommende Objekt als Bitmap casten und der Picturebox zuweisen
//(Denkt an das ".Clone()", um Zugriffsverletzungen aus dem Weg zu gehen.)
pictureBoxVideo.BackgroundImage = (Bitmap)eventArgs.Frame.Clone();
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//Beim Beenden des Programmes die Webcam wieder "freigeben",
//damit sie von anderen Anwendungen benutzt werden kann.
if (videoSource != null && videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource = null;
}
}
}
}
Ich hoffe, dass ihr nun auch im Stande seit, erfolgreich Webcams und andere Videoaufnahmequellen unter C# zu verwenden.
Solltet ihr noch Fragen, Anregungen oder Kritik haben, so schreibt mir doch einfach einen Kommentar.
Viele Grüße,
Raffi
