Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛАБ4 ЛабграфWEB_.doc
Скачиваний:
7
Добавлен:
14.05.2015
Размер:
415.23 Кб
Скачать

Трансформация и прозрачность изображений

Код, приведенный ниже, позволяет создать ColorMatrix, которая будучи включенной в качестве атрибута в ImageAttributes, позволит выполнить отрисовку изображения со степенью прозрачности 0.3. Кроме того, код демонстрирует применение метода RotateTransform при отрисовке изображений на Web сайт.

protected void Page_Load(object sender, EventArgs e)

{

try

{

string sFileName = Request.QueryString.Get(0);

System.Drawing.Image image = System.Drawing.Image.FromFile(sFileName);

Bitmap bitmap = new Bitmap(image.Width*3, image.Height*3, PixelFormat.Format24bppRgb);

Graphics graphics = Graphics.FromImage(bitmap);

graphics.Clear(Color.WhiteSmoke);

image.RotateFlip(RotateFlipType.Rotate90FlipX);

graphics.DrawImage(image, 0, 0);

graphics.RotateTransform(15, MatrixOrder.Append);

graphics.DrawImage(image, image.Width, 0);

graphics.RotateTransform(30, MatrixOrder.Append);

ImageAttributes imageattributes = new ImageAttributes();

ColorMatrix colormatrix = new ColorMatrix();

imageattributes.SetColorMatrix(new ColorMatrix(new float[][]{

new float[] {1, 0, 0, 0, 0},

new float[] {0, 1, 0, 0, 0},

new float[] {0, 0, 1, 0, 0},

new float[] {0, 0, 0, 0.3f, 0},

new float[] {0, 0, 0, 0, 1}}));

graphics.DrawImage(image, new Rectangle (300,50,image.Width, image.Height),

0,0,image.Width, image.Height,GraphicsUnit.Pixel, imageattributes);

Response.ContentType = "image/jpeg";

bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);

Response.End();

bitmap.Dispose();

image.Dispose();

}

catch (Exception ex)

{

Response.End();

return;

}

}

Данный код работает с bmp, png, jpeg, gif, ico файлами без дополнительных преобразований.

Рис.3 Использование метода DrawImage

Имитация прозрачного фона и вывод рисунков с прозрачным фоном

Используя метод DrawImage вывести на сайт рисунок с прозрачным фоном невозможно. Причина в том, что отрисовку изображения метод выполняет на собственный холст, цвет которого можно задать методом Clear.

graphics.Clear(Color.White);

В данном случае метод будет рисовать изображение по белому фону, а при задание цветов, которые должны быть прозрачными, они будут заменены белым. Это хорошо, когда страничка, на которую выводится изображение, белая - создается эффект прозрачности фона. А как быть в том случае, если на страничке используется background-image или, как на данной страничке, которую Вы читаете?

В таких случаях я использую поэтапный вывод, который заключается в том, что сначала картинка отрисовывается методом DrawImage на холсте с каким-нибудь редко встречающимся в рисунках цветом, а затем методами HTML передается на сайт с указанием сделать цвет холста прозрачным.

Для выполнения данных шагов и наглядности, выполним следующее:

  • Изменим фон странички, для чего в файле Default.aspx изменим тэг body:

  • <body style="background-color : Teal">

  • В файле Default.aspx.cs изменим вывод картинки на сайт, как картинки с прозрачным цветом:

  • sTegImage = "<IMG style=\"filter:Chroma(Color='#010101')\"

  • src = \"MakeGraph.aspx?cs=" + sFileName +"\">";

  • В файле MakeGraph.aspx.cs напишем нижеприведенный код:

  • string sFileName = Request.QueryString.Get(0);

  • System.Drawing.Image image = System.Drawing.Image.FromFile(sFileName);

  • //Картинку будем выводить уменьшенную в 2 раза

  • Bitmap bitmap = new Bitmap(image.Width/2, image.Height/2, PixelFormat.Format24bppRgb);

  • Graphics graphics = Graphics.FromImage(bitmap);

  • //Цветом прозрачности выбираем цвет пикселя изображения [0,0]

  • Bitmap bitmap1 = new Bitmap(image);

  • Color transparentcolor = bitmap1.GetPixel(0, 0);

  • ImageAttributes imageattributes = new ImageAttributes();

  • imageattributes.SetColorKey(transparentcolor, transparentcolor);

  • //Можно задать дипазон прозрачных цветов

  • //attr.SetColorKey(Color.FromArgb(0, 0, 250), Color.FromArgb(0, 0, 255));

  • //Делаем фон отрисовки почти черным

  • //Можно было задать белый, тогда при выводе на страничку с белам цветом

  • //будет эффект прозрачности фона

  • graphics.Clear(Color.FromArgb(1, 1,1));

  • graphics.DrawImage(image, new Rectangle(0, 0, image.Width/2, image.Height/2),

  • 0, 0, image.Width, image.Height, GraphicsUnit.Pixel, imageattributes);

  • MemoryStream memorystream = new MemoryStream();

  • bitmap.Save(memorystream, ImageFormat.Png);

  • byte[] b = memorystream.GetBuffer();

  • Response.ContentType = "image/png";

  • Response.BinaryWrite(b);

Результат работы показан на Рис.4.

Рис. 4 Использование прозрачного фона