Problem z obiektem Image

problemy z tworzeniem aplikacji graficznych oraz audio i wideo

Problem z obiektem Image

Nowy postprzez tom_85 » niedziela, 20 lipca 2008, 22:52

Witam,

Chcę zrobić sobie taki program w którym mogę coś narysować i potem przekonwertować na odpowiedni ciąg zer i jedynek żebym mógł sobie to potem wrzucić na mikrokontroler AVR. Problem tylko w tym że nie mogę sobie poradzić z obiektem Image. Otóż wrzuciłem go na formę i chciałem żeby zajmował całe dostępne miejsce na formie nawet po zmianie wielkości formy. No i włączam program i niby jest ok do póki nie zacznę zmieniać rozmiaru formy.

Do zdarzenia OnResize obiektu Form1 wpisałem:
Kod: Zaznacz cały
Image1->Width = Form1->ClientWidth;
Image1->Height = Form1->ClientHeight;
Image1->Canvas->FillRect(Rect(0,0,StrToInt(Form1->ClientWidth),StrToInt(Form1->ClientHeight)));


właściwości width oraz height obiektu Image zmieniają się ale "biały prostokącik" po którym mogę rysować się nie zmienia po rozciągnięciu okna :/


---------------------------------------------
hmmmm ustawiłem Align na allClient oraz Stretch na true no i teraz Image zmienia rozmiar razem z Formą tylko że gdy chcę coś po niej rysować to pozycję kursora jak i grubość pisaka też mi skaluje :/
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
tom_85
 
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 21 lipca 2008, 10:04

Do takiego wyrównywania obiektów służy właściwość Align wszystkich komponentów. Wykorzystując tą właściwość nie musisz wogóle pisać kodu wyrównującego.

Ustawienia właściwości Align:

  • alClient - wyrównanie obiektu do lewej, prawej doÅ‚u i góry, czyli obiekt zawsze bÄ™dzie zajmowaÅ‚ caÅ‚Ä… dostÄ™pnÄ… powierzchniÄ™ i to jest to czego potrzebujesz
  • alTop - wyrównanie do góry, czyli obiekt zawsze bÄ™dzie przyklejony do górnej powierzchni
  • alBottom - wyrównanie do doÅ‚u
  • alLeft - wyrównanie do lewej
  • alRight - wyrównanie do prawej
  • alNone - brak wyrównanie, po umieszczeniu obiektu na formularzu w wiÄ™kszoÅ›ci przypadków, wszystkie majÄ… takie poczÄ…tkowe ustawienie
  • alCustom - to wyrównanie jest podobne do alClient, z tÄ… różnicÄ…, że wszystkie cztery boki obiektu zawsze zachowujÄ… swojÄ… pierwotnÄ… odlegÅ‚ość od powierzchni na której zostaÅ‚y umieszczone.

Kilka obiektów na formularzu może mieć ustawione takie same lub różne wartości dla tej właściwości.

Sugeruję poeksperymentować ze wszystkimi ustawieniami, wtedy zrozumiesz na czym to polega.



Funkcję wypełniającą obiekt kolorem (biały prostokącik) musisz wywoływać zawsze gdy następuje zmiana rozmiaru obiektu, a to dlatego, że ten "prostokącik" rysujesz zawsze o określonym rozmiarze i gdy zmieniasz rozmiar obiektu, to musisz go przerysować, z tym, że jeżeli narysujesz coś na obiekcie, a potem go ponownie wypełnisz kolorem to tym samym "zamalujesz" to co zostało narysowane wcześniej, czyli zawsze musisz przerysowywać wszystko, a zatem funkcja FillRect musi być zawsze wywoływana przed narysowaniem innych obiektów i każda zmiana rozmiaru powierzchni na której rysujesz wymaga ponownego odrysowania wszystkiego, łącznie z wypełnieniem. Nic tutaj nie odbywa się automatycznie.
Zdarzenie OnPaint dowolnego obiektu który je posiada, powoduje odrysowanie całej kontrolki zawsze gdy następują w niej zmiany, ale odrysowywane jest tylko to co kontrolka przechowuje, a klasa Canvas jest nietrwała, czyli po dokonaniu dowolnej zmiany w samym obiekcie posiadającym Canvas wszystko zostaje w jej Canvas zastąpione nowymi wartościami domyślnymi obiektu i trzeba cały Canvas przerysowywać ponownie.


Kolejna uwaga to ten fragment kodu:
StrToInt(Form1->ClientWidth),StrToInt(Form1->ClientHeight)


Funkcja StrToInt służy do konwersji łańcucha znaków (wartość typu AnsiString) na liczbę całkowitą (wartość typu Integer - int), tymczasem właściwości ClientWidth i ClientHeight są typu Integer więc nie zachodzi tutaj potrzeba konwersji, użycie funkcji StrToInt jest tutaj wręcz błędem, prawidłowy zapis wygląda wiec tak:

Kod: Zaznacz cały
Image1->Canvas->FillRect(Rect(0, 0, Form1->ClientWidth, Form1->ClientHeight));


Poza tym jeżeli obiekt Image1 znajduje się na Form1 i odwołujesz się do wymiarów tego właśnie formularza, to podawanie pełnego adresu tego formularza nie jest konieczne, gdyż kompilatora jeżeli nie "napotka" przed właściwością obiektu żadnego odwołania do innego, to przypisze formularz domyślny, więc ten zapis może wyglądać tak:

Kod: Zaznacz cały
Image1->Canvas->FillRect(Rect(0, 0, ClientWidth, ClientHeight));


Poza tym funkcja FillRect oczekuje wartości typu TRect, więc lepiej jest tutaj podać właśnie taką wartość:

Kod: Zaznacz cały
Image1->Canvas->FillRect(ClientRect); // Form1->ClientRect




Reasumując, cokolwiek rysujesz na dowolnym obiekcie, powinieneś umieszczać cały kod rysujący lub odwołanie do takiej funkcji w zdarzeniu OnPaint takiego obiektu, z tym, że obiekt TImage nie obsługuje takiego zdarzenia, więc możesz się w jego przypadku posłużyć zdarzeniem OnPaint formularza, gdyż TImage jest specyficznym obiektem odrysowywanym zawsze na innym obiekcie, nie posiada tak naprawdę własnej powierzchni. Możesz również zastąpić TImage obiektem TPaintBox, gdyż on obsługuje zdarzenie OnPaint.
Zdarzenie OnPaint jest wywoływane automatycznie i zawsze gdy zachodzi potrzeba odświeżenia płótna Canvas.
Nie musisz się koniecznie posługiwać TImage czy TPaintBox, możesz z równą skuteczności rysować bezpośrednio na formularzu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez riddyk » poniedziaÅ‚ek, 21 lipca 2008, 14:36

Witam.

Problem w tym że zmieniasz Image`a, a nie właściwość canavas, spróbuj zmienić jeden z tych:

Kod: Zaznacz cały
Image1->Picture->Width;
Image1->Picture->Height;
Image1->Picture->Bitmap->Width;
Image1->Picture->Bitmap->Height;


wraz ze zmianÄ… samego Image`a

( jeśli dobrze zrozumiałem problem, pliku nie ściągałem )
google to twój przyjaciel, pielęgnuj tą przyjaźń, rozmawiajcie, zadawaj mu pytania, na pewno Cię nie zawiedzie.
Avatar użytkownika
riddyk
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 20 lipca 2008, 17:27
Lokalizacja: Gliwice
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez Cyfrowy Baron » poniedziaÅ‚ek, 21 lipca 2008, 14:55

Nie sądzę, żeby mu o to chodziło. Zmiana rozmiaru Bitmapy, zakładając, że do Image wczytano jakąś grafikę, nie spowoduje zmianę rozmiaru Image. Picture tylko zwraca Width i Height, nie mozna mu przypisać wymiarów, tylko je pobrać.



Do tom_85: Co do załączonego przez Ciebie pliku, to po pierwsze jeżeli chcesz, żeby taki plik można było uruchomić na innym komputerze to powinieneś go kompilować razem z bibliotekami w przeciwnym razie w systemach w których nie ma załączonych przez Ciebie do programu bibliotek, taki program się nie uruchomi, nawet jeżeli jest tam zainstalowany BCB, gdyż może to być inna wersja, ty używasz BCB w wersji 6 a ja w 10.
Po drugie sam plik programu niewiele mówi o problemie, jedynie go obrazuje, znacznie lepiej byłoby dołączyć projekt, tylko bez plików tymczasowych gdyż zajmują dużo miejsca, a są zupełnie zbędne.



Plik wsadowy Clean.bat do usuwania plików tymczasowych z projektów. Skopiować do katalogu z projektem i uruchomić:
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez riddyk » wtorek, 22 lipca 2008, 23:34

Witam,

w końcu przejrzałem plik, i jest problem, z brakiem skalowania, albo z skalowaniem.

Powiec mi czy zwiększając rozmiar formy chcesz zwiększyć ilość pikseli ? czy chcesz aby ilość pikseli została taka sama ?

Znając AVR to pewnie chcesz aby została taka sama, więc chcesz poprzez zmianę rozmiaru formy, zrobić zooma Imageowi.

Więc należy pozycję myszki wymnożyć przez ilość pikseli i podzielić przez aktualną wielkość Image ( teraz strzelam co z czym, może dobrze).

taka zwykła proporcja, oczywiście dla osi x i y trzeba to zrobić osobno.
google to twój przyjaciel, pielęgnuj tą przyjaźń, rozmawiajcie, zadawaj mu pytania, na pewno Cię nie zawiedzie.
Avatar użytkownika
riddyk
Bladawiec
Bladawiec
 
Posty: 20
Dołączył(a): niedziela, 20 lipca 2008, 17:27
Lokalizacja: Gliwice
PodziÄ™kowaÅ‚ : 0
OtrzymaÅ‚ podziÄ™kowaÅ„: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez Cyfrowy Baron » Å›roda, 23 lipca 2008, 09:39

tom_85 napisał(a):[...]
Otóż wrzuciłem go na formę i chciałem żeby zajmował całe dostępne miejsce na formie nawet po zmianie wielkości formy. No i włączam program i niby jest ok do póki nie zacznę zmieniać rozmiaru formy.


Ja to rozumiem w ten sposób, że ma na formularzu obiekt Image, kod który wprowadził w zdarzeniu OnResize formularza ma mu w zamyśle zmieniać rozmiar Image, tak, żeby po zmianie rozmiaru formularz Image dalej zajmował cały jego obszar. Do tego służ właściwość Align, ustawiona na al.Client.

Skoro mamy tutaj tyle wątpliwości, to niech moze sam autor postu wypowie się precyzyjniej o co chodzi...
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez tom_85 » Å›roda, 23 lipca 2008, 20:09

[quote="tom_85"]no tak... przepraszam że się nie odzywałem oraz dziękuje za pomoc, bardzo się przydały Wasze podpowiedzi :-) chodziło mi o to żeby po zwiększeniu formy obiekt image dalej zajmował cały dostępny obszar, żeby piksele nie były rozciągnięte oraz żeby kursor nie był tak "dziwnie" skalowany. Problem jest już rozwiązany... co prawda nie potrafiłem poradzić sobie z tym w obiekcie Image ale za to w obiekcie PaintBox wszystko mi działa tak jak chciałem :-) Jak zwykle nieocenioną pomocą okazała się strona http://cyfbar.republika.pl która moim zdaniem jest lepsza od każdej książki o języku C++.

Niestety pojawił się następny problem... otóż chciałem wczytywać obrazek z pliku, no i przy pierwszym wczytaniu zawsze wszystko jest ok ale przy kolejnym... drugim, trzecim, czwarty... gdy najadę kursorem nad listę plików (w otwartym okienku OpenPictureDialog) to program mi się po prostu wyłącza :/ podobnie dziej się gdy próbuje wczytać obrazek za pomocą OpenDialog. Na początku myślałem że to wina programu (bo po wczytaniu zamieniam obrazek na 8-kolorowy) ale okazało się że nie :/ Zrobiłem sobie formę na którą wrzuciłem tylko OpenPictureDialog no i to samo się dzieje :/ Więc to chyba wina tych komponentów... da się to jakoś "naprawić" ??

Kod: Zaznacz cały
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
bmp = new Graphics::TBitmap();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClick(TObject *Sender)
{
        if(OpenPictureDialog1->Execute())
                bmp->LoadFromFile(OpenPictureDialog1->FileName);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete bmp;       
}


chyba że przed ponownym wczytaniem do bmp trzeba go jakoś "wyczyścić" albo zwolnić pamięć ?? chociaż też próbowałem już kilku funkcji które niestety nic nie dawały :/



--------------------------------------------------------
tak w ramach ścisłości wklejam kod "właściwego" programu
Kod: Zaznacz cały
#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm1 *Form1;
bool pioro = 0;
TPoint pozycja;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        DoubleBuffered = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
        bmp = new Graphics::TBitmap();
        Image1->Picture->Bitmap->LoadFromResourceName((int)HInstance, "MENUKOLORY");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
        delete bmp;       
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        pioro = 1;
        pozycja = Point(X, Y);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseUp(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        pioro = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1MouseMove(TObject *Sender,
      TShiftState Shift, int X, int Y)
{
        if(pioro)
        {
                PaintBox1->Canvas->MoveTo(pozycja.x, pozycja.y);
                bmp->Canvas->MoveTo(pozycja.x, pozycja.y);
                pozycja = Point(X, Y);
                PaintBox1->Canvas->LineTo(X, Y);
                bmp->Canvas->LineTo(X, Y);
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CSpinEdit1Change(TObject *Sender)
{
        if(CSpinEdit1->Value < 1)
                CSpinEdit1->Value = 1;
        else if(CSpinEdit1->Value > 100)
                CSpinEdit1->Value = 100;
        else
        {
                PaintBox1->Canvas->Pen->Width = CSpinEdit1->Value;
                bmp->Canvas->Pen->Width = CSpinEdit1->Value;
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Otwrzbmp1Click(TObject *Sender)
{
        if(OpenPictureDialog1->Execute())
        {
                bmp->LoadFromFile(OpenPictureDialog1->FileName);
                Form1->Width = bmp->Width + 98;
                Form1->Height = bmp->Height + 73;
                PaintBox1->Canvas->Draw(0, 0, bmp);

                //--- konwersja na 8 kolorów ---

                TColor kolor;
                byte rv, gv, bv;
                for(int i = 0; i < bmp->Height; ++i)
                {
                        for(int j = 0; j < bmp->Width; ++j)
                        {
                                kolor = bmp->Canvas->Pixels[j][i];
                                rv = GetRValue(kolor);
                                gv = GetGValue(kolor);
                                bv = GetBValue(kolor);

                                (rv >127) ? (rv = 255) : (rv = 0);
                                (gv >127) ? (gv = 255) : (gv = 0);
                                (bv >127) ? (bv = 255) : (bv = 0);

                                bmp->Canvas->Pixels[j][i] = RGB(rv, gv, bv);
                        }
                }
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Zapiszbmp1Click(TObject *Sender)
{
        if(SavePictureDialog1->Execute())
                bmp->SaveToFile(SavePictureDialog1->FileName);       
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
        bmp->Width = PaintBox1->Width;
        bmp->Height = PaintBox1->Height;
        PaintBox1->Canvas->Draw(0, 0, bmp);
}

Było oczywiście więcej problemów ale jakoś sobie z nimi poradziłem :-) na stronie Pana Profesora był kod do zmiany poszczególnych kolorów w pikselach z wykorzystaniem funkcji ScanLine ale mi jakoś nie chciał działać bo co 3 piksel chyba funkcja opuszczała... jeszcze miałem trochę problemów z tym odświeżaniem tego wszystkiego ale poradziłem sobie z tym tak że jednocześnie rysuje po PaintBox i po bmp i w zdarzeniu onPaint obiektu PaintBox przerysowywuje to sobie :-)
Avatar użytkownika
tom_85
 
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez Cyfrowy Baron » Å›roda, 23 lipca 2008, 20:53

W zaprezentowanym kodzie nie widzę żadnego błędu i nic nie wskazuje na to, że program powinien się "wieszać" lub zamykać przy wczytywaniu kolejnej grafiki.
Co do funkcji scanline to zwróć uwagę na to co napisałem w poradzie oprócz 3 parametrów RGB jest tam czwarty parametr, który chociaż nie gra roli musi być uwzględniany, gdyż występuje w strukturze. Przy pominięciu tego parametru uzyskuje się błąd (opuszczanie co 3 lini) z przetwarzaniem grafiki o którym piszesz.

Przed wczytaniem nowej grafiki do obiektu bmp musisz przywrócić mu głębię 24 bitów, czy też taką jak ma wczytywana grafika. Gdyż za pierwszym wczytaniem zmieniasz mu głębię bitową na 8, w pamięci tego obiektu tak pozostaje i w efekcie przy ponownym wczytaniu grafiki o większej głębi robisz to do obiektu, który ma ustawioną niższą głębię bitową. Nie jestem pewien czy to błąd, a nie chce mi się teraz tego sprawdzać, sugerowałbym więc wstawienie przed wczytanie grafiki prostej instrukcji:

bmp->PixelFormat = pf24bit;

Ta twoja funkcja konwertująca piksele jest mało wydajna, gdyż robi to piksel po pikselu.
Błąd z wczytywaniem kolejnych bitmap prawdopodobnie ma związek z konwersją kolorów.
Być może po konwersji powinieneś ustawić bitmapę na 4 bity (4 bity = 16 kolorów): bmp->PixelFormat = pf4bit;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez tom_85 » Å›roda, 23 lipca 2008, 21:50

nie zmieniam przecież głębi kolorów tylko zmieniam kolor każdego pixela... zamieniam R, G i B na 0 albo 255... czyli nadal jest 3 kolory x 8 bitów = 24 bitowa głębia kolorów. Potrzebuje 8 kolorów więc żeby je uzyskać musiałbym mieć głębie... 3 bitową :)

wiem że to nie jest wydajne rozwiązanie ale nie potrzebuje przetważać w ten sposób ogromnej ilości obrazków dlatego nie szukam jakiegoś optymalnego rozwiązania :)

a co do tego wczytywania obrazków to właśnie specjalnie sobie wrzuciłem na osobną forme to co jest na pierwszym listingu w poprzednim poście. Nie ma tam nic oprócz wczytywania kolejnych obrazków a i tak się wyłącza program. Musi to być problem albo z builderem albo z tymi komponentami jakiś problem bo wyłącza się nawet jak próbuje wczytać ten sam obrazek ponownie.
Avatar użytkownika
tom_85
 
    NieznanyNieznana

Re: Problem z obiektem Image

Nowy postprzez Cyfrowy Baron » czwartek, 24 lipca 2008, 10:25

Długo używałem środowiska Borland C++ Builder 6 Enterprise iPersonal, ale nigdy nie stwierdziłem żadnego błędu z komponentami klasy TOpen***
Stawiam na to, że masz jakiś mało zauważalny błąd w kodzie programu, być może włączyłeś do projektu jakąś bibliotekę, która powoduje błędy.

Proponuję pewne rozwiązanie, ale bardzo wątpię, żeby to mogło pomóc:
   W pliku źródÅ‚owym (np. Unit1.cpp) formularz głównego (tego pierwszego) wstaw na samej górze pliku nad wszystkimi wpisami:

#define NO_WIN32_LEAN_AND_MEAN
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
PodziÄ™kowaÅ‚ : 12
OtrzymaÅ‚ podziÄ™kowaÅ„: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje multimedialne, graficzne

Kto przeglÄ…da forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość

cron