Wypelnianie struktury bitmap

0

Witam mam problem ze struktura BITMAP z biblioteki windows.h otoz nie moge znalezc funkcji ktora by ja wypelniala po podaniu tylko adresu pliku z ktorego ma ja pobrac a pamitem ze na zajeciach gdzies w msdn bylo to nawet na przykladzie pokazane a dzisiaj grzebie w masdnie juz prawie godzine i nie moge znalezc tego sposobu czy ktos moze go zna/pamieta i moglby sie podzielic? :)

0

Nie znam, nie pamiętam, ale polecam WIC (Windows Imaging Component) zamiast starego sposobu ładowania bitmap, jest imho prościej i obsługuje różne formaty, nie tylko BMP.

0

Nie wiem czy istnieje jedna funkcja która zrobi całość ale można to zrobić 2 funkcjami LoadBitmap http://msdn.microsoft.com/en-us/library/windows/desktop/dd145033%28v=vs.85%29.aspx
i GetObject http://msdn.microsoft.com/en-us/library/windows/desktop/dd144904%28v=vs.85%29.aspx
oczywiście na koniec trzeba jeszcze po sobie posprzątać a więc DeleteObject http://msdn.microsoft.com/en-us/library/windows/desktop/dd183539%28v=vs.85%29.aspx

EDIT:
Sorry pomyliłem nie LoadBitmap tylko LoadImage http://msdn.microsoft.com/en-us/library/windows/desktop/ms648045%28v=vs.85%29.aspx

0

a maglbys mi mniej wiecej wyjasnic jak za pomoca tych funkcji zaladowac bitmape? bo jakos nie moge sie z tymi strukturami polapac jak to zainicjalizowac :/

1

No tu może być problem bo nie mam kompilatora C++ a nie znam tak dobrze aby napisać bez kompilatora bo mógłbym narobić byków. Napisałem przykład w Delphi może sobie poradzisz a jak nie to może ktoś inny przetłumaczy:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows;

var
  hBmp: HBITMAP;
  bmp: BITMAP;
begin
  hBmp:= LoadImage(0, 'C:\test.bmp', IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE or LR_DEFAULTSIZE);
  if (hBmp > 0) then
  begin
    if (GetObject(hBmp, SizeOf(bmp), @bmp) > 0) then
    begin
      Writeln('Width: ', bmp.bmWidth);
      Writeln('Height: ', bmp.bmHeight);
      Writeln('BitsPixel: ', bmp.bmBitsPixel);
      Readln;
    end;
    DeleteObject(hBmp);
  end;
end.
0

czyli jak dobrzeteraz wnioskuje w zmiennej hbmp jest bitmapa z pixelami i ogolnie mniej wiecej cos takiego : http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371(v=vs.85).aspx ?

bo chodzi mi glownie o to czy stosujac teraz ta zmienna bmp bede mogl w prosty sposob prztlumaczyc sobie na c++ funkcje z tego tematu: http://4programmers.net/Delphi/gotowce/ScanLine_-_kontrast,_nasycenie,_negatyw,_przyciemnienie,_rozjaśnienie,_rozmycie,_sepia,_skala_szarości,_wykucie,wypłowienie,_zamiana_RGB_i_inne..

0

no ok ale teraz juz wiem przynajmniej jak dane bitmapy zaladowac do zmiennej wiec dalej sobie juz jakos poradze dzieki za pomoc :)

troche jeszcze poczytalem i pokmninilem i znalazlem takie cos: http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.aspx
no i korzystajac z tego i podanego tam przykladu chcialem sobie w taki sposob zadefiniowac wlasnie taki objekt alewysypuje mi kupe bledow i nie rozumiem dlaczego ponizej kod calosci chodzi glownie o poczatek czyli definicje "Bitmap^ bmp" oraz o wiersz "bmp = gcnew Bitmap("C:\Documents and Settings\Admin\Pulpit\program\aston.bmp",true);" bo to na nich kompilator sie wysypuje, moglby mi ktos napisac co robie zle ?

 
#include <windows.h>
#include <math.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <fstream>


using namespace std;



BITMAPFILEHEADER bm_h;
BITMAPV5HEADER bm_v5;
RGBQUAD bm_rgb;
Bitmap^ bmp;

int main()
{
	ifstream fh ("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston.bmp", ifstream::in);
	ofstream fhout("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston_out.bmp", ios::binary);
	bmp = gcnew Bitmap("C:\\Documents and Settings\\Admin\\Pulpit\\program\\aston.bmp",true);
	fh.read((char *)(&bm_h),sizeof(bm_h));
	fh.read((char *)(&bm_v5),sizeof(bm_v5));
	fh.read((char *)(&bm_rgb),sizeof(bm_rgb));
	cout<<"typ:"<<bm_h.bfType<<endl<<"rozmiar:"<<bm_h.bfSize<<endl;
	cout<<"szer.:"<<bm_v5.bV5Width<<endl<<"wys.:"<<bm_v5.bV5Height<<endl;
	cout<<"kolory:"<<bm_v5.bV5BitCount<<endl<<"kompresja:"<<bm_v5.bV5Compression<<endl;
	cout<<"blue:"<<(string *)(bm_rgb.rgbBlue)<<endl<<"green:"<<(string *)(bm_rgb.rgbGreen)<<endl<<"red:"<<(string *)(bm_rgb.rgbRed)<<endl;
	fh.seekg(bm_h.bfOffBits, ios::beg);

	long **bitmap = new long *[bm_v5.bV5Width];
	for (int x =0 ; x<bm_v5.bV5Width; x++){
		bitmap[x] = new long [bm_v5.bV5Height];
	}
	
	for (int h=0 ; h<bm_v5.bV5Height ; h++)
	{
		for (int w = 0 ; w<bm_v5.bV5Width ; w++)
		{
			fh.read((char *)(&bitmap[w][h]), 3 );
		}
			
	}
	
	fhout.write((char *)(&bm_h.bfType), sizeof(bm_h.bfType));
	fhout.write((char *)(&bm_h.bfSize), sizeof(bm_h.bfSize));
	fhout.write((char *)(&bm_h.bfReserved1), sizeof(bm_h.bfReserved1));
	fhout.write((char *)(&bm_h.bfReserved2), sizeof(bm_h.bfReserved2));
	fhout.write((char *)(&bm_h.bfOffBits), sizeof(bm_h.bfOffBits));
	fhout.write((char *)(&bm_v5.bV5Size), sizeof(bm_v5.bV5Size));
	fhout.write((char *)(&bm_v5.bV5Width), sizeof(bm_v5.bV5Width));
	fhout.write((char *)(&bm_v5.bV5Height), sizeof(bm_v5.bV5Height));
	fhout.write((char *)(&bm_v5.bV5Planes), sizeof(bm_v5.bV5Planes));
	fhout.write((char *)(&bm_v5.bV5BitCount), sizeof(bm_v5.bV5BitCount));
	fhout.write((char *)(&bm_v5.bV5Compression), sizeof(bm_v5.bV5Compression));
	fhout.write((char *)(&bm_v5.bV5SizeImage), sizeof(bm_v5.bV5SizeImage));
	fhout.write((char *)(&bm_v5.bV5XPelsPerMeter), sizeof(bm_v5.bV5XPelsPerMeter));
	fhout.write((char *)(&bm_v5.bV5YPelsPerMeter), sizeof(bm_v5.bV5YPelsPerMeter));
	fhout.write((char *)(&bm_v5.bV5ClrUsed), sizeof(bm_v5.bV5ClrUsed));
	fhout.write((char *)(&bm_v5.bV5ClrImportant), sizeof(bm_v5.bV5ClrImportant));
	fhout.write((char *)(&bm_v5.bV5RedMask), sizeof(bm_v5.bV5RedMask));
	fhout.write((char *)(&bm_v5.bV5GreenMask), sizeof(bm_v5.bV5GreenMask));
	fhout.write((char *)(&bm_v5.bV5BlueMask), sizeof(bm_v5.bV5BlueMask));
	fhout.write((char *)(&bm_v5.bV5AlphaMask), sizeof(bm_v5.bV5AlphaMask));
	fhout.write((char *)(&bm_v5.bV5CSType), sizeof(bm_v5.bV5CSType));
	fhout.write((char *)(&bm_v5.bV5Endpoints), sizeof(bm_v5.bV5Endpoints));
	fhout.write((char *)(&bm_v5.bV5GammaRed), sizeof(bm_v5.bV5GammaRed));
	fhout.write((char *)(&bm_v5.bV5GammaGreen), sizeof(bm_v5.bV5GammaGreen));
	fhout.write((char *)(&bm_v5.bV5GammaBlue), sizeof(bm_v5.bV5GammaBlue));
	fhout.write((char *)(&bm_v5.bV5Intent), sizeof(bm_v5.bV5Intent));
	fhout.write((char *)(&bm_v5.bV5ProfileData), sizeof(bm_v5.bV5ProfileData));
	fhout.write((char *)(&bm_v5.bV5ProfileSize), sizeof(bm_v5.bV5ProfileSize));
	fhout.write((char *)(&bm_v5.bV5Reserved), sizeof(bm_v5.bV5Reserved));
	fhout.write((char *)(&bm_rgb.rgbBlue), sizeof(bm_rgb.rgbBlue));
	fhout.write((char *)(&bm_rgb.rgbGreen), sizeof(bm_rgb.rgbGreen));
	fhout.write((char *)(&bm_rgb.rgbRed), sizeof(bm_rgb.rgbRed));
	fhout.write((char *)(&bm_rgb.rgbReserved), sizeof(bm_rgb.rgbReserved));
	fhout.seekp(bm_h.bfOffBits, ios::beg);
	
	for (int h=0 ; h<bm_v5.bV5Height ; h++)
	{
		for (int w = 0 ; w<bm_v5.bV5Width ; w++)
		{
			fhout.write((char *)(&bitmap[w][h]), 3);
		}
	}
	
	for (int x=0 ;  x<bm_v5.bV5Width ; x++)
	{
		delete [] bitmap[x];
	}	
	delete [] bitmap;
	fh.close();
	fhout.close();
	system("PAUSE");
	return 0;
}

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