przechwytywanie bitmapy (zrzut ekranu) z kawałka ekranu2

0

Kod działą dla borlanda c++ dla visuala c++ nie che wyskakuja bledy jak je wyeliminowac.
jak powinien wygladac kod zrodlowy w visual studio c++ ktory przechwytuje bitmapę robi zrzut ekranu z kawałka ekranu i <ort>zapiuje </ort>ją do pamięci i do pliku w formacie bmp.

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
         HWND BCBHandle = FindWindow("TAppBuilder", NULL);
        if (BCBHandle)
    {
         HDC dc = GetWindowDC(BCBHandle);
         Graphics::TCanvas *ScreenCanvas = new Graphics::TCanvas;
         Graphics::TBitmap *BMP = new Graphics::TBitmap;
         ScreenCanvas->Handle = dc;

                 TRect rect = ScreenCanvas->ClipRect;
                 rect.Right = rect.Right - rect.Left;
         rect.Bottom = rect.Bottom - rect.Top;
                 rect.Top = 0;
                 rect.Left = 0;

         BMP->Width = rect.Right;
         BMP->Height= rect.Bottom;
         BMP->Canvas->CopyRect(rect, ScreenCanvas,ScreenCanvas->ClipRect);

         BMP->SaveToFile("c:\\zrzut.bmp");

         delete ScreenCanvas;
         delete BMP;
         ReleaseDC(BCBHandle, dc);
        }
        return 0;
}
//dokładnie ta funkcja powoduje przekopiowanie kawałka
ekranu do bitmapy w pamięci

bitmap->Canvas->CopyRect(Rect(0, 0, bitmap->Width, bitmap->Height),
&PulpitCanvas,Rect(0, 0, bitmap->Width, bitmap->Height));

zeby robiła zrzut ekrannu wybranych pikseli (kwadratu) i kopiowala z pamięci do pliku.

0
mm002 napisał(a)

Kod działą dla borlanda dla visuala nie che [...]

:| a z jakiej intencji to ma działać?

0
_crayze napisał(a)
mm002 napisał(a)

Kod działą dla borlanda dla visuala nie che [...]

:| a z jakiej intencji to ma działać?

w borlandzri skompilowało i szło uruchomic i zbobiło zrzut ekranu i zapisało do pliku.

0

masz tam takie magiczne vcl.h ...

http://pl.wikipedia.org/wiki/Visual_Component_Library

0
mm002 napisał(a)
_crayze napisał(a)
mm002 napisał(a)

Kod działą dla borlanda dla visuala nie che [...]

:| a z jakiej intencji to ma działać?

w borlandzri skompilowało i szło uruchomic i zbobiło zrzut ekranu i zapisało do pliku.

myśl trochę, chłopie...
jak napiszesz kod w C++ i zaczniesz kompilować w Delphi też się będziesz pytał dlaczego nie działa?

0
_crayze napisał(a)
mm002 napisał(a)
_crayze napisał(a)
mm002 napisał(a)

Kod działą dla borlanda dla visuala nie che [...]

:| a z jakiej intencji to ma działać?

w borlandzri skompilowało i szło uruchomic i zbobiło zrzut ekranu i zapisało do pliku.

myśl trochę, chłopie...
jak napiszesz kod w C++ i zaczniesz kompilować w Delphi też się będziesz pytał dlaczego nie działa?

jak ort! żeby działało pod visual studio mam zrozumiec ze w ort! ort! sie bo nie ma tych funkcji ale powinny byc jakies zamienniki i nie ort! ich <ort>znaleŹć</ort>.

0

"umieM", "znaleŹĆ"...

0

<ort>na razie</ort> mam cos takiego do borlanda c++ kto mi przerobi to żeby działało na visual studio c++
chyba czeba ort! funkcji BitBlt??

#include <vcl.h>
#pragma hdrstop

#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
		// HWND BCBHandle = FindWindow("TAppBuilder", NULL);
		//if (BCBHandle)
	//{
	   //HDC dc = GetWindowDC(BCBHandle);
		 HDC dc = GetDC(0);
		 Graphics::TCanvas *ScreenCanvas = new Graphics::TCanvas;
		 Graphics::TBitmap *BMP = new Graphics::TBitmap;
		 ScreenCanvas->Handle = dc;

				 TRect rect = ScreenCanvas->ClipRect;
				 rect.Right = rect.Right - rect.Left;
		 rect.Bottom = rect.Bottom - rect.Top;
				 rect.Top = 0;
				 rect.Left = 0;

		 BMP->Width = rect.Right;
		 BMP->Height= rect.Bottom;
		 BMP->Canvas->CopyRect(rect, ScreenCanvas,ScreenCanvas->ClipRect);

		 BMP->SaveToFile("c:\\zrzut.bmp");

		 delete ScreenCanvas;
		 delete BMP;
	   //	 ReleaseDC(BCBHandle, dc);
		//}
		return 0;
}
0

Poznaj najpierw język ojczysty (kropki, przecinki, duże litery, czeba urzyc), a potem dopiero próbuj programować.

0

hmm, na studiach takich podstawowych rzeczy nie uczą? gorzej niż w podstawówce
no więc, to jest tak: używasz borlandowskiej biblioteki o nazwie VCL, skoro jest borlandowska to znaczy że będzie w produktach borlandowskich, Visual jakby nie patrzeć został stworzony przez M$, więc VCL tam nie znajdziesz..
alternatywnie w Visualu jest biblioteka o nazwie MFC(niedostępna w wersji bezpłatnej), musisz przerobić kod pod MFC, alternatywnie możesz użyć czystego WinAPI (on i w borlandzie dostępny jest, bo coś wspominasz o BitBlt, to z winapi)
albo jeszcze można użyć .NET ale do tego jest troche przerobiony C++, o nazwie: C++/CLI

0

to bezsensownie powinien być jeden standard i a nie na starcie inna biblioteka do borlanda z podstawowymi operacjami jak zrobienie zrzutu ekranu do pamięci.

0
mm002 napisał(a)

to bezsensownie powinien być jeden standard ...

Z jezykow (polski, angielski, ...) jestem slaby ale ciesze sie ze nie ma jednego, szczegolnie Twojego.

Co do jeden standard teoretycznie jest (pod jeden system) i w przypadku windows nazywa sie WinAPI.
Niestety tu bedziesz musial wiedziec co nieco o tym jak zbudowana jest bitmapa oraz podstawy o operacjach graficznych.

I tak zamiast slicznej linijki

BMP->SaveToFile("c:\\zrzut.bmp");

bedziesz musial dac

void  SaveBitmap(wchar_t *szFilename,HBITMAP hBitmap)

{

      HDC dc;
      FILE* fp;
      LPVOID pBuf = NULL;
      BITMAPINFO BI;//Struktura zawierająca opis bitmapy (kolor etc)
      BITMAPFILEHEADER  BFH; //Struktura związana z opisem nagłówka WindowsBitmap

//pobieramy kontekst w przypadku gdy parametr równy jest NULL
//pobrany zostanie kontekst całego ekranu.
      dc = GetDC(NULL);
      ZeroMemory(&BI,sizeof(BITMAPINFO));
//rozmiar powinien być taki jak rozmiar struktury
//(dzięki temu można rozpoznać wersje).
      BI.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
//Funkcja GetDIBits gdy parametr lvpBits jest róny NULL
//zwraca liczbę ScanLines (nie mam pojęcia jak to przetłumaczyć)
//Dzieki tym informacją możliwe jest zaalokowanie odpowiedniej
//pamięci dla bitmapy.

      GetDIBits(dc,hBitmap,0,0,NULL,&BI,DIB_RGB_COLORS); 

//Gdy to pole nie ustawione lub mniejsze od zera, należy
//samemu obliczyć rozmiar bitmapy na podstawie wysokości,
//szerokości oraz liczby kolorów.
         if(BI.bmiHeader.biSizeImage<=0)
              BI.bmiHeader.biSizeImage=BI.bmiHeader.biWidth*abs(BI.bmiHeader.biHeight)*(BI.bmiHeader.biBitCount+7)/8;

//teraz już można przydzielić pamięć dla bitmapy
      if((pBuf = malloc(BI.bmiHeader.biSizeImage))==NULL)
      {
        MessageBoxW( NULL, L"Nie można alokować pamięci", L"Błąd", MB_OK | MB_ICONERROR);
        return;
      }            
//wybieramy brak kompresji - bitmapa zapisana jako liczby opisujące kolor RGB
            BI.bmiHeader.biCompression=BI_RGB;
//w tym przypadku wywołanie funkcji z parametrem lvpBits 
//jako przydzielony obszar pamięci: pBuf
//zwróci dane opisujące obraz z uchwytu bitmapy hBitmap do pBuf.
      GetDIBits(dc,hBitmap,0,BI.bmiHeader.biHeight,pBuf, &BI, DIB_RGB_COLORS);       
//
      if((_wfopen_s(&fp,szFilename,L"wb"))!= 0 )
      {
	  //bardziej kulturalne było by zrealizowanie tego za pomocą wyjątków
	   if (dc)  ReleaseDC(NULL,dc); 
	   if (pBuf) free(pBuf); 
       MessageBoxW( NULL, L"Nie można utworzyć bitmapy", L"Błąd", MB_OK | MB_ICONERROR);
       return;
      } 

	//rozmiar pliku
      BFH.bfSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+BI.bmiHeader.biSizeImage;
//początek pliku zaczyna się od znakó BM, notacja związana z zapisem liczb
      BFH.bfType='MB';
//miejsce od kiedy zaczynają się dane opisujące obraz
      BFH.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); 
//zapis do pliku
      fwrite(&BFH,sizeof(BITMAPFILEHEADER),1,fp);
      fwrite(&BI.bmiHeader,sizeof(BITMAPINFOHEADER),1,fp);
      fwrite(pBuf,BI.bmiHeader.biSizeImage,1,fp); 
      
//zwalniamy zasoby i zamykamy pliki
      if (dc)  ReleaseDC(NULL,dc); 
      if (pBuf) free(pBuf); 
      if (fp)   fclose(fp);
}

0

Zrzut ekranu to jest dupa, a nie podstawowa operacja. Nikt nie będzie standardyzował takich pierdół w języku ogólnego przeznaczenia.

0

Korcilo mnie aby o tym wspomniec (ale caloksztalt mnie chyba zniechecil ...)

Ranides napisał(a)

Zrzut ekranu to jest dupa, a nie podstawowa operacja.

ale nie napisal bym tego tak ladnie !!!!

0

JAk prawidłowo sprawdzić wielkość tych bitmap sizeof nie działa je porównać czy są identycznie takie same ( w tym przykładzie bitmapy się różnią wielkością ale w programie będą takie same).

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
HDC dc = GetDC(0);
TCanvas &PulpitCanvas = *new TCanvas();
Graphics::TBitmap *bitmap = new Graphics::TBitmap;
Graphics::TBitmap *bitmap2 = new Graphics::TBitmap;
PulpitCanvas.Handle = GetDC(0);
bitmap->Width = Screen->Width;
bitmap->Height = Screen->Height;
bitmap2->Width = Screen->Width;
bitmap2->Height = Screen->Height;

//dokładnie ta funkcja powoduje przekopiowanie kawałka ekranu do bitmapy w pamięci
bitmap->Canvas->CopyRect(Rect(0, 0, 122, 122), &PulpitCanvas,Rect(977,361, 977+122, 361+122));

				 bitmap->SaveToFile("c:\\zrzut.bmp");

bitmap2->Canvas->CopyRect(Rect(0, 0, 25, 25), &PulpitCanvas,Rect(977,361, 977+25, 361+25));

				 bitmap2->SaveToFile("c:\\zrzut2.bmp");

		  cout <<"wielkosc bitampy1="<<sizeof(bitmap)<<endl;
			cout <<"wielkosc bitampy2="<<sizeof(bitmap2)<<endl;

			if(memcpy(bitmap,bitmap2,sizeof(bitmap)))
			cout<<"takie same"<<endl;
			else
			cout <<"inne"<<endl;

				 delete &PulpitCanvas;
				 delete bitmap;
				 delete bitmap2;
				   ReleaseDC(0, dc);

			system("pause");

	return 0;
}

//-

0

sizeof(bitmap) zwraca rozmiar do wskaznika na instancje klasy TBitmap. Wielkosc bitmapy w przyblizeniu header + widthhegightbitperpixel(bpp).

0

Jak powinna wyglądać funkcja która porównuje same piksele takiej bitmapy.

0

Jak funkcja - powinna mieć nagłówek i ciało.

0

Jak przekształcić ten kod do visual studio c++

#include <vcl.h>
#pragma hdrstop
#include<iostream.h>
#include <tchar.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 int i,j,licz,x,y;
 licz=0;

HDC dc = GetDC(0);
TCanvas &PulpitCanvas = *new TCanvas();
Graphics::TBitmap *bitmap = new Graphics::TBitmap;
Graphics::TBitmap *bitmap2 = new Graphics::TBitmap;
Graphics::TBitmap *bitmap3 = new Graphics::TBitmap;
PulpitCanvas.Handle = GetDC(0);
bitmap->Width = 22;
bitmap->Height = 22;
bitmap2->Width = 22;
bitmap2->Height = 22;

	x=897;
	y=281;

//dokładnie ta funkcja powoduje przekopiowanie kawałka ekranu do bitmapy w pamięci
bitmap->Canvas->CopyRect(Rect(0, 0, 22, 22), &PulpitCanvas,Rect(x,y, x+22, y+22));

				 bitmap->SaveToFile("c:\\zrzut.bmp");

bitmap2->Canvas->CopyRect(Rect(0, 0, 22, 22), &PulpitCanvas,Rect(x,y, x+22, y+22));

				 bitmap2->SaveToFile("c:\\zrzut2.bmp");
				 bitmap3->LoadFromFile("c:\\zrzut2.bmp");

			   for (i=0; i < 22; i++)
			   {
			   for (j=0; j < 22; j++)
				 {
				 if( bitmap->Canvas->Pixels[i][j]==bitmap3->Canvas->Pixels[i][j])
					{
						licz++;
					}
				 }
			   }
				   if (licz==484)
					{
						cout <<"    takie same"<<endl;
					}
				 else
					{
						cout <<"    inne"<<endl;
					}



		  cout <<"wielkosc bitampy1="<<(bitmap->Width * bitmap->Height)<<endl;
			cout <<"wielkosc bitampy2="<<(bitmap3->Width * bitmap3->Height)<<endl;


				 delete &PulpitCanvas;
				 delete bitmap;
				 delete bitmap2;
				 ReleaseDC(0, dc);
			   //  ReleaseDC(0, PulpitCanvas.Handle);

			system("pause");

	return 0;
}
0
HDC WinDC;
HDC CopyDC;
HBITMAP hBitmap;
HWND Button;
ULONG bWidth, bHeight;


WinDC = GetDC (0)
CopyDC = CreateCompatibleDC (WinDC);

bWidth =  GetDeviceCaps(WinDC, HORZRES);
bHeight = GetDeviceCaps(WinDC, VERTRES);

hBitmap = CreateCompatibleBitmap (WinDC, bWidth, bHeight);

HBITMAP oldbmp = SelectObject (CopyDC, hBitmap);
            
BitBlt (CopyDC,    0,0,    bWidth, bHeight,    WinDC,    0, 0,    SRCCOPY);

SelectObject (CopyDC, oldbmp);

SaveBitmap(L"bmp.bmp", hBitmap)
            
ReleaseDC(0, WinDC);
DeleteDC(CopyDC);

co do porownania jest set/get pixel (juz nie bede macil scanline)

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