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. /// Back pane // calculate appropriate color values return Color.FromArgb(alpha, r, g, b);
///
///
/// 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
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;
}
Treat this code as mnemonic because types conversion has been skipped in this example in order to keep it simple.
9 Фев
Merge two layers with alpha channels
13 Сен
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;
}
}
23 Окт
Ajax Benchmark 2
По просьбам читателей и из собственного любопытства решил обновить данные тестирования скорости работы браузеров с XmlHttpRequest. На этот раз подошел к процессу немного более старательно, благодаря чему выяснилось, что прошлые результаты несколько неверно отражали картину, поскольку, например, опера показала себя такой выдающейся из-за кэширования XML-ответа сервера.
Для каждого браузера было произведено 4 этапа тестирования.
1. Большой XML-ответ (50 Кб) (Big)
2. Маленький XML-ответ (154 б) (Small)
3. Большой XML-ответ без запрещения кэшировавния (Cached-Big)
3. Маленький XML-ответ без запрещения кэшировавния (Cached-Small)
Результаты приведены на диаграмме ниже. Меньшее время (и меньший размер столбика), разумеется отражает лучший результат.
К сожалению не было возможности протестировать IE 7.

Результаты в числах:

19 Окт
Microsoft.com Site Beta Version Screenshots
Зайдя сегодня на www.microsoft.com и понажимав несколько раз F5
всплыло окно с предложением поучаствовать в тестировании бета-версии нового сайта Майкрософт.
Интерфейс кардинально изменился, минимум постбэков, весь стиль очень напоминает Windows Vista
Выглядит всё это примерно так:
![]()
![]()
17 Окт
VS2003 & VS2005 Tooltips
Маленькое знаете ли вы, что… про Microsoft Visual Studio 2003/2005:
Когда у вас открыто порядочное число файлов в проекте и вы хотите закрыть все закладки, лучше щелкнуть по открытой и в контекстном меню выбрать Close All But This, и затем вручную «добить» последнюю закладку. Это сработает намного быстрее чем просто Close All, поскольку студия не будет активировать каждый открытый файл.
17 Авг
Новая версия Google Talk!
Сегодня вышло в свет обновление Google Talk (GTalk). Мы теперь умеем:
- Передавать файлы (peer-to-peer)
- Отправлять голосовую почту (пока пользователя нет в сети, записать GTalk’ом и отправить ему в почтовый ящик)
- Отображать в списке контаков возле статуса название композиции, которая в данный момент у вас проигрывается. Поддерживаются iTunes, Windows Media Player, Winamp, Yahoo Music Engine
Список достаточно приятный, чтобы скачать себе эту обновочку. Удачи!
15 Авг
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);
1 Авг
Counties/Regions/Cities database (for developers)
Когда-то по роду деятельности понадобилась мне база данных стран, областей и городов.
Выдрал я её с сайта singles.ru, делюсь архивом.
CSV-файл в формате:
ID страны;ID региона;ID города;название (страны/региона/города)
Скачать файл можно здесь (ZIP, 52 Kb);
21 Июл
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 ситуацию исправили в приятную сторону!
17 Июл
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).
Надеюсь поможет?