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

•  Animation Loaders  1 028

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

•  TDictionary Custom Sort  7 902

•  Fast Watermark Sources  7 563

•  3D Designer  10 800

•  Sik Screen Capture  8 133

•  Patch Maker  8 319

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

•  ListBox Drag & Drop  7 229

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

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

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

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

•  Canvas Drawing  6 779

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

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

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

•  Paint on Shape  3 466

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

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

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

•  Пазл Numbrix  2 853

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

•  Игра HIP  2 568

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

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

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

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

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

•  HEX View  3 034

 
скрыть

  Форум  

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

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