CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Pytanie odnośnie wczytywania

Pytanie odnośnie wczytywania

dział ogólny

Pytanie odnośnie wczytywania

Nowy postprzez xredom » środa, 15 maja 2013, 14:33

Witam mam taki problem otóż dopiero po dwukrotnym wciśnięciu buttona "wczytaj obraz", zaczyna działać mi rozmycie.
Po wczytaniu pierwszym obraz pojawia się w okienku lecz nie działa rozmywanie, dopiero po drugim kliknięciu wczytania obrazu rozmycie zaczyna działać. Mógłbym prosić o pomoc wskazania w którym miejscu tkwi problem? :roll:
załączam kod cpp
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "rozmycie.h"
#include "paint.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CSPIN"
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
        : TForm(Owner)
{


}
//---------------------------------------------------------------------------
void TForm2::PokazPodglad()
{
  BMP2-> Width = width;
  BMP2-> Height = height;
  width = Image1-> Picture-> Width;
  height = Image1-> Picture-> Height;

  BMP2->Width = xi;
  BMP2->Height = yi;

  for (i = 0; i <width-1; i++)
        for (j = 0; j <height-1; j++)
        {
        Color = Image1->Picture->Bitmap->Canvas-> Pixels[i][j];
        rgb [i][j].r_color = GetRValue(Color);
        rgb [i][j].g_color = GetGValue(Color);
        rgb [i][j].b_color = GetBValue(Color);
        }

  BMP2->Canvas->StretchDraw(Rect(0, 0, xi, yi), BMP1);

  Image1->Picture->Bitmap->Assign(BMP2);

}
//---------------------------------------------------------------------------

int min (int value1, int value2){
        if(value1>=value2)return value2;
        else return value1;
        }
        int max (int value1,int value2)
        {if (value1>=value2) return value1;
        else return value2;}
//-----------------------------------------------------------------------------
void __fastcall TForm2::BitBtn1Click(TObject *Sender) //przycisk rozmyj
{
for (i = 1; i <width-2; i++)
{
for (j = 1; j <height-2; j++)
{
red =rgb[i-1][j-1].r_color + rgb [i][j-1].r_color + rgb [i+1][j-1]. r_color +
rgb[i-1][j].r_color+rgb[i][j].r_color+rgb[i+1][j].r_color+rgb[i-1][j+1].r_color +
rgb[i][j +1].r_color+rgb[i+1][j+1].r_color;
green=rgb[i-1][j-1].g_color+rgb[i][j-1].g_color+rgb[i+1][j-1].g_color+
rgb[i-1][j].g_color+rgb[i][j].g_color + rgb[i+1][j].g_color+
rgb[i-1][j+1].g_color+rgb[i][j+1].g_color+rgb[i+1][j+1].g_color;
blue=rgb[i-1][j-1].b_color + rgb[i][j-1].b_color+rgb[i +1][j-1].b_color+
rgb[i-1][j].b_color+rgb[i][j].b_color+rgb[i+1][j].b_color+
rgb[i-1][j+1].b_color+rgb[i][j+1].b_color+rgb[i+1][j+1].b_color;
BMP2->Canvas->Pixels[i][j]=(TColor)RGB(red/9,green/9,blue/9);

}

Image1-> Picture-> Bitmap-> Assign (BMP2);

}

}
//---------------------------------------------------------------------------
void __fastcall TForm2::BitBtn2Click(TObject *Sender)
{
float degree = 0.3;

for (i = 1; i <width-1; i++){
for (j = 1; j <height-1; j++) {

red = rgb [i][j].r_color + degree *(rgb [i][j].r_color-rgb [i-1][j-1].r_color);
green = rgb [i][j].g_color + degree * (rgb [i][j].g_color-rgb [i-1][j-1].g_color);
blue = rgb [i][j].b_color + degree * (rgb [i][j].b_color-rgb [i-1][j-1].b_color);

red = min (255, max (0, red));
green = min (255, max (0, green));
blue = min (255, max (0, blue));

BMP2-> Canvas-> Pixels[i][j]= (TColor)RGB (red, green, blue);
}
Image1-> Picture-> Bitmap-> Assign (BMP2);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm2::BitBtn3Click(TObject *Sender)
{
   Form1->Image->Picture->Assign(Image1->Picture);
   Close();
}
//---------------------------------------------------------------------------


void __fastcall TForm2::BitBtn4Click(TObject *Sender)//przycisk wczytaj obraz
{
  BMP1 = new Graphics::TBitmap();
  BMP2 = new Graphics::TBitmap();
  BMP1->Assign(Form1->Image->Picture->Bitmap);
  xi = Form1->Image->Height;
  yi = Form1->Image->Width;
  PokazPodglad();
}
//---------------------------------------------------------------------------
 


i plik nagłówkowy
KOD cpp:     UKRYJ  
private:        // User declarations
  Graphics::TBitmap *BMP1;
  Graphics::TBitmap *BMP2;
  void PokazPodglad();
public:         // User declarations
        __fastcall TForm2(TComponent* Owner);
        Graphics:: TBitmap * bitmap;
        int red, green, blue;
        int xi,yi, i, j, width, height;
        struct rgb_str {
        unsigned char r_color;
        unsigned char g_color;
        unsigned char b_color;};
        rgb_str rgb [2000][2000];
};
 
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez Mironas » środa, 15 maja 2013, 14:46

Odpowiedź 'w ciemno': Po wczytaniu rozmytej bitmapy odśwież Image1.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez xredom » środa, 15 maja 2013, 15:57

Kod: Zaznacz cały
DoubleBuffered = true;

nie pomaga, chyba o to chodzi?
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez Mironas » środa, 15 maja 2013, 16:07

Raczej o jedno z:
KOD cpp:     UKRYJ  
  Image1->Refresh();
  Image1->Repaint();
 

Za ten post autor Mironas otrzymał podziękowanie od:
xredom
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez xredom » środa, 15 maja 2013, 16:12

Mironas napisał(a): Image1->Refresh();
  Image1->Repaint();

nie pomaga :(
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez Mironas » środa, 15 maja 2013, 17:25

Przy pierwszym wykonaniu funkcji PokazPodglad nie masz jeszcze nic wczytane do Image1->Picture. Dlatego wartości width i height wynoszą ZERO po wykonaniu:
KOD cpp:     UKRYJ  
  width = Image1->Picture->Width;
  height = Image1->Picture->Height;
 

A to powoduje że nie wykonują się pętle
KOD cpp:     UKRYJ  
  for (i = 0; i <width-1; i++)
    for (j = 0; j <height-1; j++)
    { ... }
 


Poza tym bardzo dziwnie i niespójnie wykonujesz zamierzone działanie. Po co Ci tablica
KOD cpp:     UKRYJ  
rgb_str rgb [2000][2000];
 

Masz bitmapy (źródłową i docelową) więc na nich możesz wykonywać wszystkie operacje. Już kiedyś ci pisałem abyś operacje robił na bitmapach a komponentów TImage używał tyko do ich wyświetlania.

Ważne:
Jeśli tworzysz obiekt operatorem new to na koniec musisz użyć delete aby zwolnić pamięć po tym obiekcie:
KOD cpp:     UKRYJ  
BMP1 = new Graphics::TBitmap();
[...]
delete BMP1;
 

Najlepiej tworzenie obiektów przenieś do zdarzenia OnShow a kasowanie obiektów do OnClose.

Za ten post autor Mironas otrzymał podziękowanie od:
xredom
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez Mironas » środa, 15 maja 2013, 17:30

Mam wrażenie, że nie potrafisz debugować kodu (śledzić jego wykonywania).

Wstaw kursor myszki do wiersza od którego chcesz śledzić kod i naciśnij F5 - pojawi się czerwona kropka na lewym marginesie. Potem startujesz aplikację F9. Jak wykonywanie kodu dojdzie do zaznaczonego miejsca to się zatrzyma a Ty najeżdżając myszką na wybraną zmienną zobaczysz w dymku jej wartość. Dalsze wykonywanie kodu kontrolujesz klawiszami F7, F8, F9.

W ten sposób możesz podpatrzeć dlaczego coś nie działa tak jak powinno.

Za ten post autor Mironas otrzymał podziękowanie od:
xredom
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez xredom » środa, 15 maja 2013, 18:11

Tak do tej pory nie umiałem debugować dzięki za tutorial :)
Pamiętam o zwolnieniu z pamięci obiektu BMP1 chciałem to zrobić na samym końcu.

Dałem pętle i działa teraz po jednym kliknięciu. Dzięki za pomoc ;)
KOD cpp:     UKRYJ  
void TForm2::PokazPodglad()
{
  int i;
for( i = 0; i <= 2; i++ )
{
  BMP2-> Width = width;
  BMP2-> Height = height;
  width = Image1-> Picture-> Width;
  height = Image1-> Picture-> Height;

  BMP2->Width = xi;
  BMP2->Height = yi;
  BMP2->Canvas->StretchDraw(Rect(0, 0, xi, yi), BMP1);

  Image1->Picture->Bitmap->Assign(BMP2);
  for (i = 0; i <width-1; i++) {
        for (j = 0; j <height-1; j++)
        {
        Color = Image1->Picture->Bitmap->Canvas-> Pixels[i][j];
        rgb [i][j].r_color = GetRValue(Color);
        rgb [i][j].g_color = GetGValue(Color);
        rgb [i][j].b_color = GetBValue(Color);
        }
   }
 }
}
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez Mironas » środa, 15 maja 2013, 18:41

xredom napisał(a):Pamiętam o zwolnieniu z pamięci obiektu BMP1 chciałem to zrobić na samym końcu.

Błąd. Nie możesz pisać kodu w ten sposób, że kilka razy wykona się new a na końcu 1 raz dajesz delete. Prawidłowo po każdym NEW musi być DELETE i dopiero potem może być znowu NEW (dla konkretnego obiektu oczywiście). Stąd moja sugestia aby wszystkie NEW/DELETE dla obiektów globalnych dać w OnShow/OnClose okna. Dzięki temu zawsze wykona się prawidłowo.

Natomiast jeśli dany obiekt używasz tyko w jednej funkcji to możesz użyć go lokalnie (tworzyć na początku funkcji i niszczyć na końcu).

xredom napisał(a):Dałem pętle i działa teraz po jednym kliknięciu.

Też źle. Działa, ale niepotrzebnie pętle wykonują się 2 razy.
Jeszcze raz: Użyj BMP1 i BMP2 jako bitmapy źródłowej i docelowej (na której wykonujesz operację), a Image1 tylko do wyświetlania tych bitmap. W tej chwili masz taki galimatias, że trudno cokolwiek poprawić aby dobrze działało. Należało by to napisać od nowa.

PS
Nie wysyłaj podziękowań oddzielnie za każdy post. Jeśli Ci pomogłem to możesz wysłać jeden.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Pytanie odnośnie wczytywania

Nowy postprzez xredom » środa, 15 maja 2013, 19:09

ok dzięki za wskazówki zobaczę co da się zrobić z tym, nie zbyt mi się chce siadać do tego tym bardziej że to nie jest jedyna funkcja w moim programie jak znajdę trochę czasu to poprawie i tak te rozmycie bym wolał inaczej zrobić na suwak albo różdżkę ;) ogólnie nie jestem programistą ale jak tak piszecie na tych forach to zaczynam coś kumać więcej.
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

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