Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

veelck

HBITMAP do strumienia

Rekomendowane odpowiedzi

jak w temacie - trzymam w klasie handle HBITMAP i potrzebuje miec ta bitmape w strumieniu std::istream - jak cos takiego moge szybko i w miare bezbolesnie zrobic? bo moge HBITMAP przerzucic do CImage, ale z CImage jest tylko mozliwosc zapisu (metoda Save)do pliku (potrzebna nazwa pliku) - czy mozna to jakos szybko obejsc? A moze jest jakis prostszy sposob? Szukalem po google, ale znalazlem tylko mozliwosc oddzielnego wrzucenia naglowka bitmapy i reszty (czyli wlasciwych danych)...

TIA

pozdro

veelck

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

a czy w ten sposob uda mi sie zapisac naglowek, czy musze to oddzielnie zrobic?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
a czy w ten sposob uda mi sie zapisac naglowek, czy musze to oddzielnie zrobic?

 

Nagłówek trzeba osobnno.

Pierwsze BITMAPFILEHEADER, a później BITMAPINFOHEADER.

 

Ew. jeśli chcesz coś na szybko to możesz oblókać CodeGuru.com lub codeproject.com.

Tam jest bardzo dużo gotowych klas, może znajdziesz coś dla siebie :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
Ew. jeśli chcesz coś na szybko to możesz oblókać CodeGuru.com lub codeproject.com.

Tam jest bardzo dużo gotowych klas, może znajdziesz coś dla siebie :)

 

Juz tam patrzylem :)

dzieki, dam znac jak poszlo :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

skoro obiecalem - moze sie to komus przyda kiedys ;)

w rezultacie nie zapisywalem calego bmp do pliku, chociaz bylo to faktycznie nie tak trudne (mozna znalezc poradnik na stronach msdn'u)

struktury BITMAPFILEHEADER i BITMAPINFOHEADER mozna wypelnic recznie, wszystkie potrzebne dane sa w strukturze BITMAP (czesc trzeba wyliczyc), w reszte wystarczy wpisac 0. Pozniej wystarczy to zapchac do strumienia zwyczajnie write'm.

Uzylem jednak zwyklego write'a i wskaznika na dane bitmapy, a nie GetDIBits, bo nie trzeba tworzyc dzieki temu contextu i jest po prostu latwiej i szybciej (chyba tez ;) )

ostatecznie zrzucenie samych danych do strumienia wyglada tak:

 

	
//!In this way we could read the file into HBITMAP structure
HBITMAP hBitmap = static_cast<HBITMAP> (LoadImage(NULL,TEXT(path.c_str()),IMAGE_BITMAP,0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION));
//! if file doesn't exist or function LoadImage() doesn't succeed, throw an exception
if(hBitmap == NULL)
throw FileOpenException()

//!serialize HBITMAP
BITMAP bitmapInfo;
::GetObject( hBitmap, sizeof( BITMAP), &bitmapInfo);
std::stringstream source(std::ios::binary | std::ios::out);
//! writing every line separately, for copying only nessesery data (3 bytes for pixel)
for ( int i=0; i<bitmapInfo.bmHeight; ++i)
	source.write(reinterpret_cast<char*> ( bitmapInfo.bmBits) + i*bitmapInfo.bmWidthBytes, bitmapInfo.bmWidth * 3);

 

przy czym wrzucam po jednej linii danych, bo windows chyba czasem lubi cos dorzucic od siebie, znaczy sie na koncu pliku, bo niektore bitmapy rozjezdzaly sie kompletnie gdy robilem bez petli, od razu "like this" ;) :

 

source.write(reinterpret_cast<char*> (bitmapInfo.bmBits), bitmapInfo.bmWidth * bitmapInfo.bmHeight * 3)

 

oczywiscie to jest tylko dla bitmapy 24bpp, dla innych trzeba to robic troszke inaczej, ale tez sie da w miare prosto ;)

 

jak juz wspomnialem - moze sie to komus kiedys gdzies przyda, bo ja musialem do tego dojsc sam (prawie ;P) - nigdzie na forum nie znalazlem.

 

A jak ktos bedzie potrzebowal zrobic konwersje dowolnej bitmapy do 24bpp to tez moge rzucic pare linii kodu ;)

 

pozdro i dzieki za naprowadzenie na droge

 

veelck

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ja jeszcze o tym rozjerzdżaniu :)

Jest to najprawdopodobniej spowodowane tym, że rozmiar każdej lini jest aliginowany do 4, tzn.

Jeśli linia nie jest podzielna przez 4, to dopisujesz przed jej początkiem tyle zer żeby była :)

Oczywiście bitmampa w pliku jest obrócona, czyli w zasadzie dopisujemy na końcu lini.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...