Клубове Дир.бг
powered by diri.bg
търси в Клубове diri.bg Разширено търсене

Вход
Име
Парола

Клубове
Dir.bg
Взаимопомощ
Горещи теми
Компютри и Интернет
Контакти
Култура и изкуство
Мнения
Наука
Политика, Свят
Спорт
Техника
Градове
Религия и мистика
Фен клубове
Хоби, Развлечения
Общества
Я, архивите са живи
Клубове Дирене Регистрация Кой е тук Въпроси Списък Купувам / Продавам 04:49 02.07.24 
Компютри и Интернет
   >> Delphi
*Кратък преглед

Тема Suzdawane na Komponenta "SminkaForm"нови  
АвторStudent (Нерегистриран)
Публикувано19.11.02 09:03



Znachi ideqta e prostta no izpulnenueto ne znam.
Iskam da naprawq edna kompomponenta koqto wsushtnost e naslednik na Class TForm no ne obiknowenna forma a formata da ima ochertaiqta na dadena snipka posochena predi towa( T.E. da se izreje da rechen glawata na dadena snimka po tochnite ochertaniq i da se pusne formata i tq da stane glawata w snimkata )
Do sega ne sum se zanimawal mnogo mnogo sus suzdawane na komponenti no mi e qstno che zora shte e da se ochertae formata kak Pred mene sedqt slednite wuprosi:
1.Kak da se wzemat razmerite na s\ochertaniqta na sminkata?
2.Kak formata shte se prechertae s tezi razmeri?

Blagodarq predwaritelno !!!



Тема Re: Suzdawane na Komponenta "SminkaForm"нови [re: Student]  
Автор PhantomASМодератор (стар ерген®)
Публикувано19.11.02 10:04



1. Не можеш ли да ползваш кирилица? Ужасно досадно е да се чете написаното на латиница.
2. Разбери за какво точно ще ползваш тази форма - за да искаш да я наследяваш - и как ще се организира точно задаването на конура по който ще се изреже формата - т.е. трябват ли ти неограничено много наследници на тази форма - в които да има различни картинки ? Или просто ти трябва една форма и вси4ките и наследници да бъдат със същите "изрязани" размери?

3. Подобен компонент съм виждал - но не се реализира от class TForm - а от TImage - каква е идеята - поставяш картинка - за която задаваш Transparant цвят - по който в runtime се изрязва формата в която е поставен компонента.

4. За алгоритъма за рязане на формата не се притеснявай - имам го - но ще го публикувам дове4ера - ако някой не ме изпревари - за да го изплзваш оба4е ти трябва затворен контур - който реално ще представлява формата след изрязването.

5. Как оба4е ще изрежеш произволна снимка - т.е. какъв е алгоритъма - ще решиш ти - но без компромиси не става ;-)))

---
Е т'ва е живот!


Тема Re: Suzdawane na Komponenta "SminkaForm"нови [re: PhantomAS]  
АвторStudent (Нерегистриран)
Публикувано19.11.02 11:24



Ами да без компромиси не става!!!
Аз отначало много си мислих че трябва да се подхване от TImage но после си помислих че ще е по ефектно с TForm. Но щом казваш че ги имаш алгоритама тогава всичко е оки?
Благодаря предварително ще чакам с нетурпение да го видя алгоритама!!!!



Тема Re: Suzdawane na Komponenta "SminkaForm"нови [re: Student]  
Автор PecheniaМодератор (нема лабаво ;-)
Публикувано20.11.02 14:16



Относно създаването на форми с неправилни размери на прозореца - удачно е да се ползва WinAPI функцията SetWindowRgn. Тази функция задава размер и форма на прозорец . Достъпни са например елипса, полигон, правоъгълник. За твоя случай мисля че е удачно да се ползва полигон.
Примерен код има http://www.delphicorner.f9.co.uk/articles/forms4.htm.
Що се отнася до изрязване на глава от снимка и преобразуването до координати, удобно е да се ползва CorelDRAW! или някаква друга програма предлагаща векторизиране. Макар че и ръчно изрязване с CorelDRAW! би било напълно достатъчно, освен ако не си супер естет.

чети и дишай по-леко


Тема Re: Suzdawane na Komponenta "SminkaForm"нови [re: Pechenia]  
АвторStudent (Нерегистриран)
Публикувано21.11.02 10:04



Да вчера се порових малко в Хелпа и я видях тази Api функция точно нея мисля да изпозвам но основното което ме интересува беше как да взема полигона на снимката т.е. неговите очертания. Тука имам един пример обаче тоя пич си го направил само за собствената си глава и нисхто друго не може да сложи (друга сминка).
Ако го знаеш алгоритама ще съм доволен ако не ще се ровя още много



Тема Алгоритъма .... [re: Student]  
Автор PhantomASМодератор (стар ерген®)
Публикувано26.11.02 11:39



I wanted to shape a form after an image.
Answer:


unit ubmp2rgn;

{
I found this routine at http://www.codeguru.com. The only
problem with this routine is that was written in C. So
I ported the routine for use in Delphi.
}

interface

uses
Windows, Messages, SysUtils, Classes, Graphics; //, Controls, Forms, Dialogs;

type BITMAP = record
bmType : integer;
bmWidth : integer;
bmHeight : integer;
bmWidthBytes : integer;
bmPlanes : Word;
bmBitsPixel : Word;
bmBits : pointer;
end;
TRectArray = Array[0..0] of TRect;
PRect = ^TRectArray;

//
// BitmapToRegion : Create a region from the "non-transparent" pixels of a bitmap
// Author : Jean-Edouard Lachand-Robert (http://www.geocities.com/Paris/LeftBank/1160/resume.htm), June 1998.
//
// hBmp : Source bitmap
// cTransparentColor : Color base for the "transparent" pixels (default is black)
// cTolerance : Color tolerance for the "transparent" pixels.
//
// A pixel is assumed to be transparent if the value of each of its 3 components (blue, green and red) is
// greater or equal to the corresponding value in cTransparentColor and is lower or equal to the
// corresponding value in cTransparentColor + cTolerance.
// HRGN BitmapToRegion (HBITMAP hBmp, COLORREF cTransparentColor = 0, COLORREF cTolerance = 0x101010)
//
function PascalBitmapToRegion(hBmp : HBITMAP; cTransparentColor : COLORREF; cTolerance : COLORREF) : HRGN;

implementation

function min(i1, i2 : integer) : integer;
begin
if (i1 < i2) then
result := i1
else if (i2 < i1) then
result := i2
else
result := i1;
end;

function PascalBitmapToRegion(hBmp : HBITMAP; cTransparentColor : COLORREF; cTolerance : COLORREF) : HRGN;
var
hRegion : HRGN;
hMemDC : HDC;
bm : Bitmap;
RGB32BITSBITMAPINFO : TBITMAPINFOHEADER;
BITMAPINFO : TBitmapInfo;
hOldBmp1 : HBITMAP;
hOldBmp2 : HBITMAP;
hDC1 : HDC;
hBM32 : HBITMAP;
bm32 : Bitmap;
pbits32 : pointer;
maxRects : dword;
hData : THandle;
pData : ^TRGNDATA;
lr : Byte;
lg : Byte;
lb : Byte;
hr : Byte;
hg : Byte;
hb : Byte;
p32 : ^Byte;
x,
y : integer;
x0 : integer;
p : ^longint;
b : Byte;
pr : PRect;
h : HRGN;
const
ALLOC_UNIT = 100;
begin
hRegion := 0;
if (hBMP <> 0) then
begin
hMemDC := CreateCompatibleDC(0);
if (hMemDC <> 0) then
begin
GetObject(hBMP, sizeof(bm), Addr(bm));
with RGB32BITSBITMAPINFO do
begin
biSize := sizeof(TBITMAPINFOHEADER);
biWidth := bm.bmWidth;
biHeight := bm.bmHeight;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := 0;
biXPelsPerMeter := 0;
biYPelsPerMeter := 0;
biClrUsed := 0;
biClrImportant := 0;
end;
bitmapinfo.bmiHeader := RGB32BITSBITMAPINFO;
hbm32 := CreateDIBSection(hMemDC, BITMAPINFO, DIB_RGB_COLORS, pbits32, 0, 0);
if (hbm32 <> 0) then
begin
holdBmp1 := HBITMAP(SelectObject(hMemDC, hbm32));
// Create a DC just to copy the bitmap into the memory DC
hDC1 := CreateCompatibleDC(hMemDC);
if (hDC1 <> 0) then
begin
// Get how many bytes per row we have for the bitmap bits (rounded up to 32 bits)
GetObject(hbm32, sizeof(bm32), addr(bm32));
while ((bm32.bmWidthBytes mod 4) <> 0) do
begin
inc(bm32.bmWidthBytes);
end;
// Copy the bitmap into the memory DC
holdBmp2 := HBITMAP(SelectObject(hDC1, hBmp));
BitBlt(hMemDC, 0, 0, bm.bmWidth, bm.bmHeight, hDC1, 0, 0, SRCCOPY);

// For better performances, we will use the ExtCreateRegion() function to create the
// region. This function take a RGNDATA structure on entry. We will add rectangles by
// amount of ALLOC_UNIT number in this structure.
maxRects := ALLOC_UNIT;
hData := GlobalAlloc(GMEM_MOVEABLE, sizeof(TRGNDATAHEADER) + (sizeof(RECT) * maxRects));
pData := GlobalLock(hData);
pData^.rdh.dwSize := sizeof(TRGNDATAHEADER);
pData^.rdh.iType := RDH_RECTANGLES;
pData^.rdh.nCount := 0;
pData^.rdh.nRgnSize := 0;
SetRect(pData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);

// Keep on hand highest and lowest values for the "transparent" pixels
lr := GetRValue(cTransparentColor);
lg := GetGValue(cTransparentColor);
lb := GetBValue(cTransparentColor);
hr := min($ff, lr + GetRValue(cTolerance));
hg := min($ff, lg + GetGValue(cTolerance));
hb := min($ff, lb + GetBValue(cTolerance));
// Scan each bitmap row from bottom to top (the bitmap is inverted vertically)
{TRICKY!!!}
p32 := ptr(integer(addr(bm32.bmBits^)) + ((bm32.bmHeight - 1) * bm32.bmWidthBytes));
for y := 0 to (bm.bmHeight-1) do
begin
// Scan each bitmap pixel from left to right
x := 0;
while (x < bm.bmWidth) do
begin
// Search for a continuous range of "non transparent pixels"
x0 := x;
p := ptr(integer(addr(p32^)) + (x*4)); // + x
while (x < bm.bmWidth) do
begin
b := GetRValue(p^);
if (b >= lr) and (b <= hr) then
begin
b := GetGValue(p^);
if (b >= lg) and (b <= hg) then
begin
b := GetBValue(p^);
if (b >= lb) and (b <= hb) then
// This pixel is "transparent"
break;
end; {if (b >= lg) and (b <= hg)}
end; {if (b >= lr) and (b <= hr)}
p := ptr(integer(addr(p^)) + 4); // + 1 // p++;
inc(x);
end; {while (x < bm.bmWidth)}
if (x > x0) then
begin
// Add the pixels (x0, y) to (x, y+1) as a new rectangle in the region
if (pData^.rdh.nCount >= maxRects) then
begin
GlobalUnlock(hData);
maxRects := maxRects + ALLOC_UNIT;
hData := GlobalReAlloc(hData, sizeof(TRGNDATAHEADER) + (sizeof(RECT) * maxRects), GMEM_MOVEABLE);
pData := GlobalLock(hData);
end; {if (pData^.rdh.nCount >= maxRects)}
pr := Addr(pData^.Buffer);
{TRICKY!!!} SetRect(pr^[pData^.rdh.nCount], x0, y, x, y+1);
if (x0 < pData^.rdh.rcBound.left) then
pData^.rdh.rcBound.left := x0;
if (y < pData^.rdh.rcBound.top) then
pData^.rdh.rcBound.top := y;
if (x > pData^.rdh.rcBound.right) then
pData^.rdh.rcBound.right := x;
if ((y+1) > pData^.rdh.rcBound.bottom) then
pData^.rdh.rcBound.bottom := y+1;
inc(pData^.rdh.nCount);

// On Windows98, ExtCreateRegion() may fail if the number of rectangles is too
// large (ie: > 4000). Therefore, we have to create the region by multiple steps.
if (pData^.rdh.nCount = 2000) then
begin
h := ExtCreateRegion(nil, sizeof(TRGNDATAHEADER) + (sizeof(RECT) * maxRects), pData^);
if (hRegion <> 0) then
begin
CombineRgn(hRegion, hRegion, h, RGN_OR);
DeleteObject(h);
end {if (hRgn <> 0)}
else
hRegion := h;
pData^.rdh.nCount := 0;
SetRect(pData^.rdh.rcBound, MAXLONG, MAXLONG, 0, 0);
end; {if (pData^.rdh.nCount = 2000)}
end; {if (x > x0)}
inc(x);
end; {while (x < bm.bmWidth)}
// Go to next row (remember, the bitmap is inverted vertically)
{TRICKY!!!} p32 := ptr(integer(addr(p32^))- bm32.bmWidthBytes);
end; {for y := 0 to (bm.bmHeight-1)}
// Create or extend the region with the remaining rectangles
h := ExtCreateRegion(nil, sizeof(TRGNDATAHEADER) + (sizeof(RECT) * maxRects), pData^);
if (hRegion <> 0) then
begin
CombineRgn(hRegion, hRegion, h, RGN_OR);
DeleteObject(h);
end {if (hRegion <> 0)}
else
hRegion := h;
// Clean up
SelectObject(hDC1, holdBmp2);
DeleteDC(hDC1);
end; {if (hDC1 <> 0)}
DeleteObject(SelectObject(hMemDC, holdBmp1));
end; {if (hbm32 <> 0)}
DeleteDC(hMemDC);
end; {if (hMemDC <> 0)}
end; {if (hBMP <> 0)}
result := hRegion;
end;

end.

---
Е т'ва е живот!


Тема Re: Алгоритъма ....нови [re: PhantomAS]  
АвторStudent (Нерегистриран)
Публикувано26.11.02 16:46



Da mnogo blagodarq wse pak che mi izprati tozi algoritam ama neshto ne kakto trqbwa tuka kato za kompilirane se kompilira ama nishto ne stawa nakraq Shte go razlgedam malko po dobre shtoto sega samo go prewurtqh ot gore ot gore no posle shte widim kakwo shte stane!



Тема Re: Алгоритъма ....нови [re: Student]  
Автор PhantomASМодератор (стар ерген®)
Публикувано26.11.02 19:24



Виж дали правилно си определил "прозрачния" цвят !

---
Е т'ва е живот!


Тема Re: Алгоритъма ....нови [re: PhantomAS]  
АвторStudent (Нерегистриран)
Публикувано27.11.02 09:27



Не птозрачиа цвят си е оки но има нещо друга в самата функция както знаеш
The RECT structure defines the coordinates of the upper-left and lower-right corners of a rectangle.
А при нашия случай човека май иска функцията сама да си определя тези стойнотти ама не става аз пробвах с мои произволни и накрая нищо, поне аз така мисля!!!




*Кратък преглед
Клуб :  


Clubs.dir.bg е форум за дискусии. Dir.bg не носи отговорност за съдържанието и достоверността на публикуваните в дискусиите материали.

Никаква част от съдържанието на тази страница не може да бъде репродуцирана, записвана или предавана под каквато и да е форма или по какъвто и да е повод без писменото съгласие на Dir.bg
За Забележки, коментари и предложения ползвайте формата за Обратна връзка | Мобилна версия | Потребителско споразумение
© 2006-2024 Dir.bg Всички права запазени.