Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Мультимедиа
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 05.12.2012, 13:24
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию HDC в файл

Добрый день знатоки) помогите с переводом из HDC в файл. поясню, функцией GetWindowDC получаю HDC окна, как мне далее, используя только winapi сохранить в файл то что там внутри, если я знаю размеры изображения... выражусь иначе на всякий случай, как мне узнать область памяти где хранится изображение ну и т д, в общем получить ту картинку не используя модуль графикс и т д, только апикой?
Ответить с цитированием
  #2  
Старый 05.12.2012, 13:37
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

через BitBlt отрисуй свой device context на предварительно созданый device context BITMAP'а и сохряняй BITMAP в файл. пример есть в Win32 SDK Reference.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 05.12.2012, 13:53
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

да про BitBlt знаю, я не знаю как создать свой HDC и как потом до указателя на памть всего этого дела дойти, я в графике не очень) интернет копал, нашёл что то на английском и не на делфях, не помого( там не много строчек будет? может поможете подробней?
Ответить с цитированием
  #4  
Старый 05.12.2012, 14:13
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

много писать лень, да и некогда, собираюсь в Assassin’s Creed III зарубить...
а так CreateCompatibleDC, CreateBitmap, SelectObject, BitBlt, GetDIBits...
вообщем можно у TBitmap в Graphics посмотреть сохранение или в Win32 SDK Reference.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #5  
Старый 05.12.2012, 14:25
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Ладно, в графикс тбитмап первым делом посмотрел, но там извращение такое %-| фиг чего уследишь) сейчас сишную в делфю перевести пытаюсь

преобразовал вот это
Код:
inline int GetFilePointer(HANDLE FileHandle){
	return SetFilePointer(FileHandle, 0, 0, FILE_CURRENT);
}

bool SaveBMPFile(char *filename, HBITMAP bitmap, HDC bitmapDC, int width, int height){
	bool Success=0;
	HDC SurfDC=NULL;
	HBITMAP OffscrBmp=NULL;
	HDC OffscrDC=NULL;
	LPBITMAPINFO lpbi=NULL;
	LPVOID lpvBits=NULL;
	HANDLE BmpFile=INVALID_HANDLE_VALUE;
	BITMAPFILEHEADER bmfh;
	if ((OffscrBmp = CreateCompatibleBitmap(bitmapDC, width, height)) == NULL)
		return 0;
	if ((OffscrDC = CreateCompatibleDC(bitmapDC)) == NULL)
		return 0;
	HBITMAP OldBmp = (HBITMAP)SelectObject(OffscrDC, OffscrBmp);
	BitBlt(OffscrDC, 0, 0, width, height, bitmapDC, 0, 0, SRCCOPY);
	if ((lpbi = (LPBITMAPINFO)(new char[sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD)])) == NULL) 
		return 0;
	ZeroMemory(&lpbi->bmiHeader, sizeof(BITMAPINFOHEADER));
	lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	SelectObject(OffscrDC, OldBmp);
	if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, NULL, lpbi, DIB_RGB_COLORS))
		return 0;
	if ((lpvBits = new char[lpbi->bmiHeader.biSizeImage]) == NULL)
		return 0;
	if (!GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi, DIB_RGB_COLORS))
		return 0;
	if ((BmpFile = CreateFile(filename,
						GENERIC_WRITE,
						0, NULL,
						CREATE_ALWAYS,
						FILE_ATTRIBUTE_NORMAL,
						NULL)) == INVALID_HANDLE_VALUE)
		return 0;
	DWORD Written;
	bmfh.bfType = 19778;
	bmfh.bfReserved1 = bmfh.bfReserved2 = 0;
	if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
		return 0;
	if (Written < sizeof(bmfh)) 
		return 0; 
	if (!WriteFile(BmpFile, &lpbi->bmiHeader, sizeof(BITMAPINFOHEADER), &Written, NULL)) 
		return 0;
	if (Written < sizeof(BITMAPINFOHEADER)) 
		return 0;
	int PalEntries;
	if (lpbi->bmiHeader.biCompression == BI_BITFIELDS) 
		PalEntries = 3;
	else PalEntries = (lpbi->bmiHeader.biBitCount <= 8) ?
					  (int)(1 << lpbi->bmiHeader.biBitCount) : 0;
	if(lpbi->bmiHeader.biClrUsed) 
	PalEntries = lpbi->bmiHeader.biClrUsed;
	if(PalEntries){
	if (!WriteFile(BmpFile, &lpbi->bmiColors, PalEntries * sizeof(RGBQUAD), &Written, NULL)) 
		return 0;
		if (Written < PalEntries * sizeof(RGBQUAD)) 
			return 0;
	}
	bmfh.bfOffBits = GetFilePointer(BmpFile);
	if (!WriteFile(BmpFile, lpvBits, lpbi->bmiHeader.biSizeImage, &Written, NULL)) 
		return 0;
	if (Written < lpbi->bmiHeader.biSizeImage) 
		return 0;
	bmfh.bfSize = GetFilePointer(BmpFile);
	SetFilePointer(BmpFile, 0, 0, FILE_BEGIN);
	if (!WriteFile(BmpFile, &bmfh, sizeof(bmfh), &Written, NULL))
		return 0;
	if (Written < sizeof(bmfh)) 
		return 0;
	return 1;
}]
в это
Код:
function SaveBMPFile(filename:PChar;bitmap:HBITMAP;width,height:integer):boolean;
var
  Success:boolean;
  SurfDC,OffscrDC:HDC;
  OffscrBmp,OldBmp:HBITMAP;
  lpbi:PBitmapInfo;
//  lpvBits:LPVOID;
  BmpFile:THANDLE;
  bmfh:BITMAPFILEHEADER;
  lpvBits:Pointer;
  Written:DWORD;
  PalEntries:integer;
//
  bitmapDC:HDC;
begin

  bitmapDC:=GetWindowDC(bitmap);
//  bitmap:=GetBitmapFromDesktop(bitmapDC);
	Success:=false;
	SurfDC:=0;
	OffscrBmp:=0;
	OffscrDC:=0;
	lpbi:=nil;
//	lpvBits=NULL;
  BmpFile:=INVALID_HANDLE_VALUE;
  Result:=false;
  OffscrBmp := CreateCompatibleBitmap(bitmapDC, width, height);
	if (OffscrBmp = NULL)then
		exit;
  OffscrDC := CreateCompatibleDC(bitmapDC);
	if (OffscrDC = NULL)then
		exit;
	OldBmp := HBITMAP(SelectObject(OffscrDC, OffscrBmp));
	BitBlt(OffscrDC, 0, 0, width, height, bitmapDC, 0, 0, SRCCOPY);
  getmem(lpbi,sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD));
	if (lpbi = nil)then
		exit;
  FillChar(lpbi.bmiHeader,sizeof(BITMAPINFOHEADER),#0);
	lpbi.bmiHeader.biSize := sizeof(BITMAPINFOHEADER);
	SelectObject(OffscrDC, OldBmp);
	if(GetDIBits(OffscrDC, OffscrBmp, 0, height, nil, lpbi^, DIB_RGB_COLORS)=0)then
		exit;
  GetMem(lpvBits, lpbi^.bmiHeader.biSizeImage);
//  if lpvBits = nil then ...}

	if (lpvBits = nil)then
		exit;
	if (GetDIBits(OffscrDC, OffscrBmp, 0, height, lpvBits, lpbi^, DIB_RGB_COLORS)=0)then
		exit;
  BmpFile:= CreateFile(filename,
						GENERIC_WRITE,
						0, nil,
						CREATE_ALWAYS,
						FILE_ATTRIBUTE_NORMAL,
						0);
	if (BmpFile = INVALID_HANDLE_VALUE)then
		exit;
	bmfh.bfType := 19778;
	bmfh.bfReserved1 := 0;
  bmfh.bfReserved2 := 0;
	if (not WriteFile(BmpFile, bmfh, sizeof(bmfh), Written, nil))then
		exit;
	if (Written < sizeof(bmfh))then
		exit;
	if (not WriteFile(BmpFile, lpbi.bmiHeader, sizeof(BITMAPINFOHEADER), Written, nil))then
		exit;
	if (Written < sizeof(BITMAPINFOHEADER))then
		exit;
	if (lpbi.bmiHeader.biCompression = BI_BITFIELDS)then
		PalEntries := 3
	else
  if((lpbi.bmiHeader.biBitCount <= 8))then
//    PalEntries := (int)(1 << lpbi->bmiHeader.biBitCount)
  else
		PalEntries:=0;
	if(lpbi.bmiHeader.biClrUsed<>0)then
	PalEntries := lpbi.bmiHeader.biClrUsed;
	if(PalEntries<>0)then
  begin
	if (not WriteFile(BmpFile, lpbi.bmiColors, PalEntries * sizeof(RGBQUAD), Written, nil))then
		exit;
  if (Written < PalEntries * sizeof(RGBQUAD))then
		exit;
	end;
	bmfh.bfOffBits := GetFilePointer(BmpFile);
	if ( not WriteFile(BmpFile, lpvBits, lpbi.bmiHeader.biSizeImage, Written, nil))then
		exit;
	if (Written < lpbi.bmiHeader.biSizeImage)then
		exit;
	bmfh.bfSize := GetFilePointer(BmpFile);
	SetFilePointer(BmpFile, 0, 0, FILE_BEGIN);
	if (not WriteFile(BmpFile, bmfh, sizeof(bmfh), Written, nil))then
    exit;
	if (Written < sizeof(bmfh))then
		exit;
	result:=true;
end;

но не работает( помогите, подскажите, поправьте пожалуйста

Последний раз редактировалось reqyz, 05.12.2012 в 15:36.
Ответить с цитированием
  #6  
Старый 05.12.2012, 20:16
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Ну кто нибудь!!!! помогите, я не в том разделе написал что-ли?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:03.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025