Показаны сообщения с ярлыком code. Показать все сообщения
Показаны сообщения с ярлыком code. Показать все сообщения

понедельник, 7 декабря 2009 г.

Как создать прозрачное GIF изображение используя C#

Не существует аппаратно легкого пути создания прозрачного GIF изображения используя .NET framework. Microsoft предоставила метод класс Bitmap именуемый MakeTransparent(), но он не работет для GIF-ов, похоже он работет только PNG файлов.

Решение:

Нужно создать цветовую палитру используя спецификацию GIF specification. Для выполнения этого нужно сохранить непрозрачный GIF в MemoryStream, а затем перебрав бинарные данные, обновить цветову палитру новыми "прозрачными" битами.




/// <summary>
/// Returns a transparent background GIF image from the specified Bitmap.
/// </summary>
/// <param name="bitmap">The Bitmap to make transparent.</param>
/// <param name="color">The Color to make transparent.</param>
/// <returns>New Bitmap containing a transparent background gif.</returns>
public Bitmap MakeTransparentGif(Bitmap bitmap, Color color)
{
byte R = color.R;
byte G = color.G;
byte B = color.B;</p>
MemoryStream fin = new MemoryStream();
bitmap.Save(fin, System.Drawing.Imaging.ImageFormat.Gif);
MemoryStream fout = new MemoryStream((int)fin.Length);
int count = 0;
byte[] buf = new byte[256];
byte transparentIdx = 0;
fin.Seek(0, SeekOrigin.Begin);
//header
count = fin.Read(buf, 0, 13);
if ((buf[0] != 71) || (buf[1] != 73) || (buf[2] != 70)) return null; //GIF
fout.Write(buf, 0, 13);
int i = 0;
if ((buf[10] & 0×80) > 0)
{
i = 1 << ((buf[10] & 7) + 1) == 256 ? 256 : 0;
}
for (; i != 0; i—)
{
fin.Read(buf, 0, 3);
if ((buf[0] == R) && (buf[1] == G) && (buf[2] == B))
{
transparentIdx = (byte)(256 – i);
}
fout.Write(buf, 0, 3);
}
bool gcePresent = false;
while (true)
{
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
if (buf[0] != 0×21) break;
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
gcePresent = (buf[0] == 0xf9);
while (true)
{
fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
if (buf[0] == 0) break;
count = buf[0];
if (fin.Read(buf, 0, count) != count) return null;
if (gcePresent)
{
if (count == 4)
{
buf[0] |= 0×01;
buf[3] = transparentIdx;
}
}
fout.Write(buf, 0, count);
}
}
while (count > 0)
{
count = fin.Read(buf, 0, 1);
fout.Write(buf, 0, 1);
}
fin.Close();
fout.Flush();
return new Bitmap(fout);
}

пятница, 30 января 2009 г.

Как сделать, чтобы в DotNetNuke работала при авторизации опция "Помнить меня"

Опция "Помнить меня" ("Remember Me") при логине на сайте сделанном на DotNetNuke осуществлена посредством размещения зашифрованной аутентификационного куки (cookie) на компьютере пользователя.

Окончане срока действия этого куки контролируется сначением параметра "timeout" в в узле Forms Autentication node в конфигурационном файле web.config.

< name=".DOTNETNUKE" protection="All" timeout="60" cookieless="UseCookies">

Значение по умолчанию 60 минут, поэтому сайт не может "запомнить" кого-либо по истечении этого времени.

Для увеличения времени запоминания аутентифицированных пользователей нужно увеличить значение параметра timeout.

< name=".DOTNETNUKE" protection="All" timeout="22345" cookieless="UseCookies">

Вы можете также установить режим sliding expiration, который подразумевает то, что каждый раз, когда пользователь посещает веб-сайт до истечения срока действия аутентификационного куки, то срок действия этого куки продлевается на величину параметра "timeout". Этот режим включается так:

< name=".DOTNETNUKE" protection="All" timeout="10080" slidingexpiration="true" cookieless="UseCookies">

Посмотреть как это работает можно на этом сайте.

среда, 29 октября 2008 г.

Как динамически сменить запрос для ListView привязанного к LinqDataSource?

Для того чтобы динамически сменить запрос для ListView привязанному к LinqDataSource нужно обработать событие OnSelecting у LinqDataSource. 

Например вот так:


protected void dsMates_Selecting(object sender, LinqDataSourceSelectEventArgs e)
{
if (Request.Params["classMateId"] != null)
{
int mateId;
if (int.TryParse(Request.Params["classMateId"], out mateId))
{
using (DataClassesPrivateMsgDataContext db = new DataClassesPrivateMsgDataContext())
{
e.Result = db.Classmates.Where(mate => mate.Id == mateId).FirstOrDefault();
}
}
}
}

Посмотреть как это работает можно здесь: сайт а-класса

вторник, 21 октября 2008 г.

Форматтер C# JavaScript HTML ASP.NET кода для вашего блога

Так как мне часто приходится выкладывать на своем блоге код на C#, javaScript, HTML, то хотелось, чтобы он был красиво и главное удобно для чтения оформлен. Поэтому я пользуюсь для этого бесплатным онлайн сервисом, который находится здесь:

www.manoli.net/csharpformat/format.aspx

Рекомендую всем!