алгоритм заштриховки областей на изображении

Тема в разделе "WASM.ZEN", создана пользователем slow, 10 мар 2005.

  1. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    уважаемые воители дзена,

    срочно требуется алгоритм заштриховки областей на изображении. каждая область ограничена замкнутой

    кривой черного цвета. известна точка внутри области, которую

    требуется заштриховать.

    з.ы. не подскажете доку по работе с psd.

    з.з.ы. я сделал для bmp но по рабоче-крестьянски, и работает медленно. хотелось бы побыстрее.

    спасибо!
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Тебе нужен алгоритм процедуры FloodFill (имя функции в языке Паскаль).



    Вот мой вариант: http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=38632.



    Вот еще исходник:


    Код (Text):
    1. {Закраска замкнутой области}
    2. Procedure Fill_Area(Color_Bound,Color_In:byte; X,Y:word);
    3.   Const
    4.     Buff_Size=(320+200)*2; {Посмотри свой стек !!!}
    5.   Var
    6.     Fill_Buffer:Array[1..Buff_Size] of Word;
    7.   Begin
    8.     Asm
    9.       push  0A000h
    10.       pop   ES
    11.       cld
    12.       mov   AX,320
    13.       mul   Y
    14.       mov   BX,X
    15.       add   BX,AX
    16.       mov   DH,Color_Bound
    17.       mov   DL,Color_In
    18.       sub   BP,Buff_Size
    19.       mov   SI,BX
    20.       xor   CX,CX
    21.       xor   DI,DI {}
    22.       call  @Check
    23.       test  CX,CX
    24.       jz    @Done
    25. @Main_Loop: mov   ES:[BX],DL
    26.             Call  @Find_Points
    27.             test  DI,DI
    28.             jz    @Done
    29.             dec   DI
    30.             dec   DI
    31.             mov   BX,[BP+DI]
    32.             jmp   @Main_Loop
    33. @Find_Points: xor   CX,CX
    34.               lea   SI,[BX-320]
    35.               call  @Check
    36.               lea   SI,[BX+320]
    37.               call  @Check
    38.               lea   SI,[BX-1]
    39.               call  @Check
    40.               lea   SI,[BX+1]
    41.               call  @Check
    42.               test  CL,CL
    43.               jnz   @Found
    44.               dec   SI
    45.               dec   SI
    46.               call  @Check
    47. @Found:       ret
    48. @Check:       mov   AL,ES:[SI]
    49.               cmp   AL,DH
    50.               jz    @Next
    51.               cmp   AL,DL
    52.               jz    @Next
    53.               mov   [BP+DI],SI
    54.               inc   DI
    55.               inc   DI
    56.               cmp   DI,Buff_Size
    57.               ja    @Done
    58.               inc   CL
    59. @Next:        ret
    60. @Done: add  BP,Buff_Size
    61.     End;
    62.   End;
     
  3. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    это вроде алгоритм заливки области, но идея вроде понятна, спасибо!

    может все же есть алгоритм штриховки линиями(параллельными) под определенным углом?
     
  4. captain cobalt

    captain cobalt New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2003
    Сообщения:
    222
    Адрес:
    /ru/perm
    Штриховка = заливка текстурой. ;)
     
  5. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    это интересное определение. но разве floodfill позволяет заливать текстурой? (з.ы. сорри за возможную тупость)
     
  6. Loger

    Loger New Member

    Публикаций:
    0
    Регистрация:
    28 авг 2003
    Сообщения:
    71
    Адрес:
    Minsk
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){

    BITMAPINFO bmi;

    unsigned long uBmpData[128][128];

    for (int i=0;i<128;i++){

    for (int j=0;j<128;j++){

    if ((i+j)%2) uBmpData[j] = RGB(-i-j,0,0);

    else uBmpData[j] = RGB(0,i+j,i+j);

    }

    }

    bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);

    bmi.bmiHeader.biWidth = 128;

    bmi.bmiHeader.biHeight = 128;

    bmi.bmiHeader.biPlanes = 1;

    bmi.bmiHeader.biBitCount = 32;

    bmi.bmiHeader.biCompression = BI_RGB;

    bmi.bmiHeader.biSizeImage = 0;

    bmi.bmiHeader.biXPelsPerMeter = 3692;

    bmi.bmiHeader.biYPelsPerMeter = 3692;

    bmi.bmiHeader.biClrUsed = 0;

    bmi.bmiHeader.biClrImportant = 0;

    BITMAPFILEHEADER bfh;

    bfh.bfSize = sizeof(bfh);

    bfh.bfType = 'MB';

    bfh.bfReserved1 = bfh.bfReserved2 = 0;

    bfh.bfOffBits = sizeof(bfh) + sizeof(bmi.bmiHeader);

    HANDLE hFile = CreateFile("output.bmp",GENERIC_READ | GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);

    unsigned long uWritten;

    WriteFile(hFile,&bfh,sizeof(bfh),&uWritten,NULL);

    WriteFile(hFile,&bmi.bmiHeader,sizeof(bmi.bmiHeader),&uWritten,NULL);

    WriteFile(hFile,uBmpData,sizeof(uBmpData),&uWritten,NULL);

    CloseHandle(hFile);

    exit(0);

    }
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    slow

    Если для Win32, то можно воспользоваться API-функцией FloodFill.
     
  8. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    slow

    А ещё можно сначала залить область определённым цветом, а потом нанести штрихи логическим OR или XOR. Тогда, если правильно выбрать цвет фона, область окажется прозрачной для штрихов.
     
  9. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    Quantum,

    Loger,

    captain cobalt,

    _Chingachguk_,

    спасибо за соучастие.



    По поводу работы возникло еще 2 вопроса:

    1) как работать с psd

    2) как залить область произвольной текстурой



    Спасибо!
     
  10. blood

    blood New Member

    Публикаций:
    0
    Регистрация:
    21 ноя 2004
    Сообщения:
    56
    Адрес:
    Russia
    Если X Y - координаты заливаемой точки, то заливай Texture[X mod W,Y mod H]. W,H соответственно ширина и высота текстуры.
     
  11. slow

    slow New Member

    Публикаций:
    0
    Регистрация:
    27 дек 2004
    Сообщения:
    615
    thanx