konwersja Bitmapy do DIB

0

<font size="2"></span><font size="3"></span>Witam, mam do napisania program w C++ builderze:

  1. Zaladowac standardowa bitmape z pliku. Utworzyc DIB o takich samych rozmiarach. Przekopiowac zawartosc bitmapy do DIB. Wyzerowac wszystkie skladowe oprócz czerwonej.Wyswietlic bitmape na formularzu.

  2. Jak zmodyfkowac program, aby DIB narysowany na formularzu nie znikal przy przerysowaniu formularza? Jak go odswierzac?

  3. Napisac program, który bodzie na calej powierzchni formularza pokazywal powiekszony fragment pulpitu znajdujacy sie pod myszka. Aby zdarzenie OnMouseMove bylo wywolywane poza formularzem, nalezy wcisnac klawisz myszy wewnatrz formularza i nie puszczajac go przesuwac kursorem po calym ekranie.

Napisany przeze mnie fragment programu wygląda następująco

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HBITMAP hbmp=NULL;
BYTE*bitmapa=NULL;
HDC dc=NULL;
TCanvas *c;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 DoubleBuffered = true;
 Graphics :: TBitmap * bmp = new Graphics :: TBitmap();
 bmp -> Width = Image1 -> Width;
 bmp -> Height = Image1 -> Height;
 Image1 -> Picture -> Assign(bmp);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  BitBlt(Canvas->Handle, 0, 0, Image1 -> Picture -> Width, Image1 -> Picture -> Height, dc, 0, 0, SRCCOPY);
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Zakoncz1Click(TObject *Sender)
{
 Close();

 if(hbmp!=NULL) DeleteObject(hbmp); // Usuwanie bitmapy
 if(dc!=NULL)DeleteDC(dc); 
 if(c!=NULL) delete c; // Usuwanie Canvas
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Wczytaj1Click(TObject *Sender)
{
 if(OpenPictureDialog1->Execute())
 Image1 ->Picture -> LoadFromFile(OpenPictureDialog1->FileName);

 BITMAPINFOHEADER bi;
 memset(&bi,0,sizeof(BITMAPINFOHEADER));
 bi.biSize=sizeof(BITMAPINFOHEADER); // Rozmiar tej struktury
 bi.biWidth= Image1 -> Picture -> Width; // Szeroko´s´c bitmapy
 bi.biHeight= Image1-> Picture -> Height; // Wysoko´s´c bitmapy
 bi.biPlanes=1; // Musi by´c równe 1
 bi.biBitCount=24; // Ilo´s´c bitów na piksel
 bi.biCompression=BI_RGB; // Format bez kompresji
 dc=CreateCompatibleDC(Canvas->Handle);
 hbmp=CreateDIBSection(dc,(BITMAPINFO*)&bi,
 DIB_RGB_COLORS,(VOID**)&bitmapa,NULL,0);
 if(hbmp==NULL) ShowMessage("Bitmapa nie utworzona!");
 SelectObject(dc,hbmp);
 c=new TCanvas();
 c->Handle=dc;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
  BITMAP b;
  GetObject(hbmp,sizeof(BITMAP),&b);
  Image1->Picture->Bitmap->PixelFormat=pf24bit;
  RGBQUAD *kolumna;


  int w=Image1->Picture->Bitmap->Width;
  int h=Image1->Picture->Bitmap->Height;
  for(int x=0;x<h;++x)
  {
    kolumna=(RGBQUAD*)Image1->Picture->Bitmap->ScanLine[x];

    for(int y=0;y<w;++y)
    {
     int b= kolumna[y].rgbBlue;
     int g=kolumna[y].rgbGreen;
     int r=kolumna[y].rgbRed;

     <b>bitmapa[y*b.bmWidthBytes+x*3]=b;
     bitmapa[y*b.bmWidthBytes+x*3+1]=g;
     bitmapa[y*b.bmWidthBytes+x*3+2]=r;</b>
    }
  }
  Image->Repaint(); 
}
//---------------------------------------------------------------------------

W miejscu przeze mnie pogrubionym w czasie kompilacji pojawia się błąd: ?Structure required on left side of . or .*? . Byłbym wdzięczny gdyby ktoś wytłumaczył mi w czym tkwi błąd.

// po cholerę przyklejasz taki wątek? chcesz bana zaliczyć? - Ł

0

Witam!

Widze ze jestes z UZ...
Napisz maila do autora tych zadan (dr Piotr Stec), a on na pewno Ci pomoze.
W moim przypadku stara sie nakierowac odpowiednio, ale na pewno nie napisze Ci gotowego rozwiazania.

Pozdro!

0

chetnie bym pomogl, ale nie widze tego pogrubienia [???]

0
  <b>bitmapa[y*b.bmWidthBytes+x*3]=b;
     bitmapa[y*b.bmWidthBytes+x*3+1]=g;
     bitmapa[y*b.bmWidthBytes+x*3+2]=r;</b>

Chodziło mi o ten fragment, nie wiem dlaczego niepogrubilo :/.

P.S przepraszam za przyklejenie posta, najgorsze ze zrobilem to przez przypadek :(

0

BITMAP b;
int b= ;

zdecyduj sie ktorej zmiennej dasz ta nazwe

0

Wielkie dzieki, taki banalny blad a niezauważylem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1