Merge two layers with alpha channels

Recently I’ve faced interesting task and would like to share solution with community. Task sounds quite simple: «merge two images with (a,r,g,b) components (i.e. 24-bit) into single image, preserving right transparency and color values (for example as Photoshop does)». The solution came only after very strong research, because formulas are not as simple as expected to be. Source code example presented below.

///

/// Merges two pixel one on other
///

/// Back pane
/// Front pane
/// Mixed pixel data (color), taking their alpha-channels into consideration
public static Color MergePixels(this Color lb, Color lf)
{
int alpha = lf.A + lb.A * (255 - lf.A) / 255;
if (alpha == 0) return Color.FromArgb(0, Color.White); // both layers are completely transparent, return opaque pixel

// calculate appropriate color values
int r = (lf.A * lf.R + (alpha - lf.A) * lb.R) / alpha;
int g = (lf.A * lf.G + (alpha - lf.A) * lb.G) / alpha;
int b = (lf.A * lf.B + (alpha - lf.A) * lb.B) / alpha;

return Color.FromArgb(alpha, r, g, b);
}

Treat this code as mnemonic because types conversion has been skipped in this example in order to keep it simple.

The way to convert generic type into C# string representation

Today I’ve faced with task to convert variable of type Type (wich can be generic) into string exression. For example, I have such variable:
Type someType = typeof(Dictionary);
and I need to have C#-string representation of this type as follows: «Dictionaнy<Int32,String>«. Quite useful during T4-templates generation.
Here is small code snippet for that:

public class GenericTypeFormatter
{
private const char GenericTypeParameterPrefix = '<';
private const char GenericTypeParameterSuffix = '>';
public static string GenericTypeToString(Type type)
{
if (!type.IsGenericType) return type.Name;
Type[] args = type.GetGenericArguments();

StringBuilder joinedTypeArgs = new StringBuilder();
foreach (Type t in args)
{
if (joinedTypeArgs.Length > 0) joinedTypeArgs.Append(",");
joinedTypeArgs.Append(GenericTypeToString(t));
}

return
type.GetGenericTypeDefinition().Name.Replace("`" + args.Length, "") +
GenericTypeParameterPrefix +
joinedTypeArgs +
GenericTypeParameterSuffix;
}
}

Ajax Benchmark 2

По просьбам читателей и из собственного любопытства решил обновить данные тестирования скорости работы браузеров с XmlHttpRequest. На этот раз подошел к процессу немного более старательно, благодаря чему выяснилось, что прошлые результаты несколько неверно отражали картину, поскольку, например, опера показала себя такой выдающейся из-за кэширования XML-ответа сервера.
Для каждого браузера было произведено 4 этапа тестирования.
1. Большой XML-ответ (50 Кб) (Big)
2. Маленький XML-ответ (154 б) (Small)
3. Большой XML-ответ без запрещения кэшировавния (Cached-Big)
3. Маленький XML-ответ без запрещения кэшировавния (Cached-Small)
Результаты приведены на диаграмме ниже. Меньшее время (и меньший размер столбика), разумеется отражает лучший результат.
К сожалению не было возможности протестировать IE 7.
Ajax XmlHttp Benchmark
Результаты в числах:
Ajax Benchmark Data

Microsoft.com Site Beta Version Screenshots

Зайдя сегодня на www.microsoft.com и понажимав несколько раз F5 :) всплыло окно с предложением поучаствовать в тестировании бета-версии нового сайта Майкрософт.
Интерфейс кардинально изменился, минимум постбэков, весь стиль очень напоминает Windows Vista :) Выглядит всё это примерно так:
Microsoft.com site beta screenshot #1
‘Microsoft.com site beta screenshot #2

VS2003 & VS2005 Tooltips

Маленькое знаете ли вы, что… про Microsoft Visual Studio 2003/2005:
Когда у вас открыто порядочное число файлов в проекте и вы хотите закрыть все закладки, лучше щелкнуть по открытой и в контекстном меню выбрать Close All But This, и затем вручную «добить» последнюю закладку. Это сработает намного быстрее чем просто Close All, поскольку студия не будет активировать каждый открытый файл.

Новая версия Google Talk!

Сегодня вышло в свет обновление Google Talk (GTalk). Мы теперь умеем:

  1. Передавать файлы (peer-to-peer)
  2. Отправлять голосовую почту (пока пользователя нет в сети, записать GTalk’ом и отправить ему в почтовый ящик)
  3. Отображать в списке контаков возле статуса название композиции, которая в данный момент у вас проигрывается. Поддерживаются iTunes, Windows Media Player, Winamp, Yahoo Music Engine

Список достаточно приятный, чтобы скачать себе эту обновочку. Удачи!

Windows Live Writer C# Highlighter Plugin

Мой плагин к Windows Live Writer позволяет подсвечивать исходный текст на C#. Как всегда бета, копируйте его в папку установки WLW, поддиректорию plugins (как правило C:\Program Files\Windows Live Writer\plugins). Далее можно пользоваться: меню Insert/C# Code…;

Download: WLWHL.zip, 21 Kb.

Example (created with WLWHL):

for (int i=0; i<10; i++){
	//writes value of i
	Console.WriteLine("Value: "+i);
	/*
	just a comment
	*/
}

Или вот суперпример:

if (var == true)
    return true;
else if (var == false)
    return false;
else
    return (!false && !true);

Counties/Regions/Cities database (for developers)

Когда-то по роду деятельности понадобилась мне база данных стран, областей и городов.
Выдрал я её с сайта singles.ru, делюсь архивом.
CSV-файл в формате:

ID страны;ID региона;ID города;название (страны/региона/города)

Скачать файл можно здесь (ZIP, 52 Kb);

AJAX Benchmark

Сегодня стало любопытна скорость работы различных браузеров по отправке/приему XML посредством Ajax.
Произвёл измерение времени получения при помощи XmlHttpRequest 10 массивов чисел int из 16 элементов. Копию XML приводить лень :) .
И вот какие любопытные результаты получились:

0.101 сек – Opera 8.5 (7700)
0.125 сек – Internet Explorer 7.0.5296 beta
0.156 сек – Opera 9 beta (8367)
2.000 сек – Mozilla Firefox 1.5.0.4
4.000 сек – Internet Explorer 6.0.3790

Огромный отрыв оперы неясен, и печально, что мои любимые браузеры настролько ей проигрывают. Но даже визуально работать с сайтами, активно использующими Ajax, на порядок приятнее в Опере.

Похоже в 7 версии IE ситуацию исправили в приятную сторону!

Debugging JavaScript with Visual Studio.NET

Известно, что Visual Studio позволяет легко отлаживать серверный код ASP.Net. Но у меня часто возникали проблемы с отладкой клиентского JavaScript.

Как это сделать:

1. Включить отладку клиентских скриптов в Internet Explorer
* Меню Tools, Internet Options.
* Закладка Advanced, секция Browsing, снять флажок с галки «Disable script debugging», жмем OK.
* Закрыть Internet Explorer.
2. В функциях JavasSript используйте ключевое слово «debugger«. Это заставит Visual Studio переключиться в отладку скрипта по достижении указанной строки.
3. Ну и запускайте ваше ASP.Net приложение в режиме отладки (Debug).

Надеюсь поможет? :)

Follow

Get every new post delivered to your Inbox.