- •Отображение графической информации с использованием HttpHandler
- •Отображение графической информации с использованием дополнительной страницы
- •Возможности преобразований графических файлов при их отображении на сайте
- •Вывод рисунков на Web сайт
- •Возможности преобразования форматов графических файлов с использованием класса Bitmap
- •Возможности сжатия и трансформации графических файлов, преобразованных в формат jpg
- •Сжатие формата jpg
- •Трансформация файла формата jpg
- •Возможности сжатия графических файлов изменением числа бит на пиксель и их трансформации
- •Использование метода DrawImage для работы с графическими файлами
- •Трансформация и прозрачность изображений
- •Имитация прозрачного фона и вывод рисунков с прозрачным фоном
Лабораторная работа. Работа с WEB графикой на С# в Visual Studio
Цель работы : освоение инструментов поддержки проектов с WEB графикой на С# в Visual Studio
ЗАДАНИЕ: Из приведенных фрагментов кодов собрать проекты ASP.NET,
поддерживающие приведенные изображения (декларировать препроцессорами классы )
Два подхода к отображению графической информации в ASP.NET
Как известно, графика в HTML отображаются через запрос в URL (src), с прямым указанием имя и расширения файла. Однако - если графический образ хранится где-то, например, в БД, или формируется динамически, то мы должны запросить адрес страницы, где формируется изображение и, далее, как-то превратить этот запрос в принятую форму вывода изображения. То есть, нельзя вернуть запрошенный графический объект как некую последовательность байт, а необходимо его интерпретировать или, иначе, преобразовать в картинку, а запрос трактовать как URL к графическому объекту.
Для этой цели служит класс HttpResponse, который предназначен для формирования данных ответа на запрос HTTP. Cвойство класса HttpResponse.OutputStream - позволяет сформировать вывод двоичных данных в теле исходящего содержимого ответа на НТТР запрос. Оба, рассматриваемых ниже метода, используют OutputStream класса HttpResponse и отличаются лишь тем, что в первом случае создается собственный обработчик конкретного запроса, а во втором случае используется отдельная Web страница для формирования двоичного потока данных, соответствующая графическому образу.
Отображение графической информации с использованием HttpHandler
ASP.NET обрабатывает запросы HTTP с помощью обработчика HttpHandler, который доступен по умолчанию для всех запрашиваемых страниц c расширением *.aspx и служб (*.asmx). HttpHandlers - это классы, реализующие интерфейсы IHttpHandler и IHttpAsyncHandler и, по существу, служат ISAPI фильтром, обработки http запросов. Запросы могут обрабатываться как синхронно (интерфейс System.Web.IHttpHandler) - HttpHandler возвращает управление по завершению обработки запроса или асинхронно (интерфейс System.Web.IHttpAsyncHandler) - путем запуска процессов обработки и возврата управления. Иначе - HttpHandlerы могут передавать выполнение запроса другим классам или же сами обрабатывают запрос и возвращают результат клиенту.
Важной особенностью ASP.NET является то, что HttpHandler может быть создан разработчиком для выполнения своих конкретных задач. Далее, мы рассмотрим создание своего собственного HttpHandler для отображения графической информации.
Создадим сайт с именем ws1. Пусть на основной странице Default.aspx необходимо отображать графическую информацию, которая будет создаваться некоторым классом MakeGraphiks, вызов которого будет обеспечивать обработчик HttpHandler. HTML код страницы:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<asp:Image id="Image1" runat="server" Height="900px"
Width="800px" ImageAlign="Middle"></asp:Image>
</form>
</body>
</html>
Перейдем к разработки непосредственно HttpHandler. Для того, чтобы любой класс мог выполнять функции HttpHandlerа, необходимо реализовать в нем интерфейс System.Web.IHttpHandler или System.Web.IHttpAsyncHandler.
(Можно также создавать экземпляр обработчика HttpHandler с помощью класса, реализующего интерфейс IHttpHandlerFactory.)
Интерфейсы System.Web.IHttpAsyncHandler и System.Web.IHttpHandler должны включать методы ProcessRequest (обработчик запроса), свойства IsReusable (поддержика организация пулов). Для интерфейса System.Web.IHttpAsyncHandler требуются дополнительно методы BeginProcessRequest и EndProcessRequest(инициализация и завершение асинхронных вызовов).
Добавим к проекту класс с именем MyHandlerGraph и включим в него необходимые методы и свойства:
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.IO;
using System.Drawing.Imaging;
public class MyHandlerGraph : IHttpHandler
{
#region IHttpHandler Members
public bool IsReusable
{
get { return true; }
}
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
//Здесь код обработки запроса
}
#endregion
}
Если при вызове HttpHandler используются сессии, то необходимо дополнить код методом GetHandler:
using System.Web.SessionState;
public virtual IHttpHandler GetHandler(HttpContext context,
string requestType, string url, string path)
{
return PageParser.GetCompiledPageInstance(url,
context.Server.MapPath("~/default.aspx"), context);
}
HttpHandler создан. Далее необходимо подключить его к приложению. Для чего в файле Web.config в секции <httpHandlers> добавим:
<httpHandlers>
.......
<add verb="GET" path="getgraph.aspx" type="MyHandlerGraph" />
</httpHandlers>
Буквально это означает, что при вызове страници getgraph.aspx необходимо запрос перенаправить HttpHandlerу MyHandlerGraph. Файл getgraph.aspx в сборке приложения реально не существует, однако для вызова HttpHandler достаточно либо непосредственно задать вызов, например:
<Image1 src="getgraph.aspx">
Либо воспользоваться следующим вызовам в Default.aspx.cs:
private void Page_Load(object sender, System.EventArgs e)
{
Image1.Attributes.Add("src","getgraph.aspx");
}
На данном этапе у нас есть зарегестрированный Handler - осталось заставить его работать по назначению.
Для начала, добавим к проекту класс (через контекстное меню) с именем MakeGraphiks.cs, который заставим формировать графическое изображение.
using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Drawing;
using System.Drawing.Drawing2D;
public class MakeGraphiks
{
private Bitmap objBitmap;
private Graphics objGraphics;
private Pen objPen;
public MakeGraphiks()
{
}
public Bitmap Create()
{
//Холст
objPen=new Pen(Color.Blue);
objBitmap = new Bitmap(800, 900);
//Графическое представление objBitmap
objGraphics = Graphics.FromImage(objBitmap);
objGraphics.Clear(Color.GhostWhite);
//Далее можем рисовать на холсте все,
//что нам хочется, задавая параметры пера,
//линий, кистей
objPen.DashStyle = DashStyle.Dot;
objPen.Width = 1;
objGraphics.DrawLine(objPen, 40, 0, 400, 0);
SolidBrush myBrush = new SolidBrush(Color.Silver);
objGraphics.FillRectangle(myBrush, 2, 2, 45, 78);
//И т.д и т.п
//в заключкнии возвращаем рисунок Handlerу
return objBitmap;
}//public Bitmap Create()
}
В этом месте можно забрать нарисованную картинку, для чего в MyHandlerGraph добавим код обработки запроса и необходимые пространства имен. Один из способов:
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
void IHttpHandler.ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
using(MakeGraphiks mkgr=new MakeGraphiks())
{
Bitmap mygraph=mkgr.Create();
using(MemoryStream ms=new MemoryStream())
{
mygraph.Save(ms,ImageFormat.Png);
Response.Clear();
Response.ContentType = "image/png";
ms.WriteTo(Response.OutputStream);
}
}
}
Теперь при вызове странички Default.aspx будет отображаться графическая информация, созданная в классе MakeGraphiks.