уважаемые воители дзена, срочно требуется алгоритм заштриховки областей на изображении. каждая область ограничена замкнутой кривой черного цвета. известна точка внутри области, которую требуется заштриховать. з.ы. не подскажете доку по работе с psd. з.з.ы. я сделал для bmp но по рабоче-крестьянски, и работает медленно. хотелось бы побыстрее. спасибо!
Тебе нужен алгоритм процедуры FloodFill (имя функции в языке Паскаль). Вот мой вариант: http://bugtraq.ru/cgi-bin/forum.mcgi?type=sb&b=2&m=38632. Вот еще исходник: Код (Text): {Закраска замкнутой области} Procedure Fill_Area(Color_Bound,Color_In:byte; X,Y:word); Const Buff_Size=(320+200)*2; {Посмотри свой стек !!!} Var Fill_Buffer:Array[1..Buff_Size] of Word; Begin Asm push 0A000h pop ES cld mov AX,320 mul Y mov BX,X add BX,AX mov DH,Color_Bound mov DL,Color_In sub BP,Buff_Size mov SI,BX xor CX,CX xor DI,DI {} call @Check test CX,CX jz @Done @Main_Loop: mov ES:[BX],DL Call @Find_Points test DI,DI jz @Done dec DI dec DI mov BX,[BP+DI] jmp @Main_Loop @Find_Points: xor CX,CX lea SI,[BX-320] call @Check lea SI,[BX+320] call @Check lea SI,[BX-1] call @Check lea SI,[BX+1] call @Check test CL,CL jnz @Found dec SI dec SI call @Check @Found: ret @Check: mov AL,ES:[SI] cmp AL,DH jz @Next cmp AL,DL jz @Next mov [BP+DI],SI inc DI inc DI cmp DI,Buff_Size ja @Done inc CL @Next: ret @Done: add BP,Buff_Size End; End;
это вроде алгоритм заливки области, но идея вроде понятна, спасибо! может все же есть алгоритм штриховки линиями(параллельными) под определенным углом?
это интересное определение. но разве floodfill позволяет заливать текстурой? (з.ы. сорри за возможную тупость)
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); }
slow А ещё можно сначала залить область определённым цветом, а потом нанести штрихи логическим OR или XOR. Тогда, если правильно выбрать цвет фона, область окажется прозрачной для штрихов.
Quantum, Loger, captain cobalt, _Chingachguk_, спасибо за соучастие. По поводу работы возникло еще 2 вопроса: 1) как работать с psd 2) как залить область произвольной текстурой Спасибо!
Если X Y - координаты заливаемой точки, то заливай Texture[X mod W,Y mod H]. W,H соответственно ширина и высота текстуры.