Недавно добавленные исходники

•  Animation Loaders  926

•  DeLiKaTeS Tetris (Тетрис)  5 870

•  TDictionary Custom Sort  7 817

•  Fast Watermark Sources  7 491

•  3D Designer  10 726

•  Sik Screen Capture  8 044

•  Patch Maker  8 251

•  Айболит (remote control)  8 302

•  ListBox Drag & Drop  7 120

•  Доска для игры Реверси  100 860

•  Графические эффекты  8 367

•  Рисование по маске  7 744

•  Перетаскивание изображений  6 344

•  Canvas Drawing  6 713

•  Рисование Луны  6 647

•  Поворот изображения  5 781

•  Рисование стержней  4 722

•  Paint on Shape  3 429

•  Генератор кроссвордов  4 412

•  Головоломка Paletto  3 555

•  Теорема Монжа об окружностях  4 355

•  Пазл Numbrix  2 820

•  Заборы и коммивояжеры  3 771

•  Игра HIP  2 541

•  Игра Go (Го)  2 541

•  Симулятор лифта  2 936

•  Программа укладки плитки  2 362

•  Генератор лабиринта  3 113

•  Проверка числового ввода  2 598

•  HEX View  3 002

 
скрыть

  Форум  

Delphi FAQ - Часто задаваемые вопросы

| Базы данных | Графика и Игры | Интернет и Сети | Компоненты и Классы | Мультимедиа |
| ОС и Железо | Программа и Интерфейс | Рабочий стол | Синтаксис | Технологии | Файловая система |



Delphi Sources

Как создать регион (HRNG) по маске



Ниже приведена функция, которая создаёт HRGN из чёрно-белого битмапа. Все чёрные пиксели становятся регионом, а белые становятся прозрачными. Так же не составит труда сделать преобразования для поддержки всех цветов и чтобы один из них был прозрачным.

По окончании необходимо освободить регион при помощи функции DeleteObject.


function BitmapToRgn(Image: TBitmap): HRGN;
var
  TmpRgn: HRGN;
  x, y: integer;
  ConsecutivePixels: integer;
  CurrentPixel: TColor;
  CreatedRgns: integer;
  CurrentColor: TColor;
begin
  CreatedRgns := 0;
  Result := CreateRectRgn(0, 0, Image.Width, Image.Height);
  inc(CreatedRgns);

  if (Image.Width = 0) or (Image.Height = 0) then
    exit;

  for y := 0 to Image.Height - 1 do
  begin
    CurrentColor := Image.Canvas.Pixels[0,y];
    ConsecutivePixels := 1;
    for x := 0 to Image.Width - 1 do
    begin
      CurrentPixel := Image.Canvas.Pixels[x,y];

      if CurrentColor = CurrentPixel then
        inc(ConsecutivePixels)
      else
      begin
        // Входим в новую зону
        if CurrentColor = clWhite then
        begin
          TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
          CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
          inc(CreatedRgns);
          DeleteObject(TmpRgn);
        end;
        CurrentColor := CurrentPixel;
        ConsecutivePixels := 1;
      end;
    end;

    if (CurrentColor = clWhite) and (ConsecutivePixels > 0) then
    begin
      TmpRgn := CreateRectRgn(x-ConsecutivePixels, y, x, y+1);
      CombineRgn(Result, Result, TmpRgn, RGN_DIFF);
      inc(CreatedRgns);
      DeleteObject(TmpRgn);
    end;
  end;
end;





Похожие по теме исходники

Рисование по маске




Copyright © 2004-2026 "Delphi Sources" by «SiteAnalyzer». Delphi World FAQ

Группа ВКонтакте