Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2012, 22:52   #1
Pack
 
Регистрация: 09.02.2012
Сообщений: 8
По умолчанию Скрин экрана. проблема с BMP

здрасте. пытаюсь средствами winapi сделать скрин экрана, есть такой вот код:
Код:
procedure MakeBMP(filename: string) ;
const
  bmpheader: array[0..53] of byte = (
    $42, $4D, $36, $00, $24, $00, $00, $00, $00, $00, $36, $00, $00, $00, $28, $00,
    $00, $00, $00, $04, $00, $00, $00, $03, $00, $00, $01, $00, $18, $00, $00, $00,
    $00, $00, $00, $00, $24, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    $00, $00, $00, $00, $00, $00);
type
  TScr = array [0..10000000] of Byte;
  PScr =  ^TScr;
var
  TBmp     : TBitmap;
  hBmp     : hBitmap;
  DeskDC   : hDC;
  DC       : hDC;
  BmpInfo  : tagBitmapInfo;
  ScrX,ScrY: Integer;
  F        : File;
  ScrSize  : Cardinal;
  Bits     : PScr;
begin
  GetMem(Bits, SizeOf(bits));
  SCRX     := GetSystemMetrics(SM_CXSCREEN);
  SCRY     := GetSystemMetrics(SM_CYSCREEN);
  ScrSize  := ScrX*ScrY*3;
  GetMem(Bits, ScrSize);
  New(bits);
  DeskDC   := GetWindowDC(GetDesktopWindow);
  hBmp     := CreateCompatibleBitmap(deskdc,ScrX,ScrY);
  DC       := CreateCompatibleDC(DeskDC);
  SelectObject(dc,hbmp);
  BitBlt(Dc,0,0,SCRX,SCRY,deskdc,0,0,SrcCopy);
  BmpInfo.bmiHeader.biSize:=sizeof(tagBitmapInfoHeader);
  BmpInfo.bmiHeader.biBitCount:=0;
  GetDiBits(DeskDC,hBmp,0,SCRY,nil,BmpInfo,DIB_RGB_COLORS);
  BmpInfo.bmiHeader.biWidth:=SCRX;
  BmpInfo.bmiHeader.biHeight:=SCRY;
  BmpInfo.bmiHeader.biPlanes:=1;
  BmpInfo.bmiHeader.biBitCount:=24;
  BmpInfo.bmiHeader.biCompression:=BI_RGB;
  BmpInfo.bmiHeader.biSizeImage:=ScrSize;
  BmpInfo.bmiHeader.biClrImportant:=0;
  GetDiBits(DeskDC,hbmp,0,SCRY,Bits,BmpInfo,DIB_RGB_COLORS);
  DeleteObject(hbmp);
  AssignFile(F,filename);
  Rewrite(F,1);
  BlockWrite(F, bmpheader, 53);
  Blockwrite(F,bits^,ScrSize);
  closeFile(F);
  FreeMem(Bits,ScrSize);
end;
проблема в том, что скрин делается через раз, и то путаются цвета. не могу понять в чем проблема, прошу помощи

Последний раз редактировалось Pack; 17.10.2012 в 23:04.
Pack вне форума Ответить с цитированием
Старый 18.10.2012, 05:54   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,883
По умолчанию

Надо создать обычный скрин экрана (с соответствующими настройками) и сравнивать побайтно файлы (я пользуюсь тотал коммандером для этого) плюс дебажить потом, в какой момент неправильно записываются данные.

Пока что, по приведённому коду заметил одну неточность:
массив 0..53 (54элт-а) а запись всего 53 элементов.
phomm вне форума Ответить с цитированием
Старый 18.10.2012, 09:21   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)почти все функции WinAPI это реально функции, возвращающие значение об успехе.
кто его проверять будет?(+ GetLastError)
2)вы заполняете BmpInfo, и при этом пишете какой то свой заголовок, он точно верный?(пишите BmpInfo тогда уж, точнее помоему тока bmiHeader идет)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.10.2012, 09:50   #4
Pack
 
Регистрация: 09.02.2012
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
1)почти все функции WinAPI это реально функции, возвращающие значение об успехе.
кто его проверять будет?(+ GetLastError)
нуу, мне кажется здесь не особо нужны эти проверки

Цитата:
Сообщение от phomm Посмотреть сообщение
Пока что, по приведённому коду заметил одну неточность:
массив 0..53 (54элт-а) а запись всего 53 элементов.
во я не внимательный исправил это и цвета перестали путатся.

но проблема осталась в силе, через раз работает как надо, а на некоторых ОС и вообще отказывается работать.

на самом деле код собирался по кусочкам из разных источников, а bmpheader был нагло взят из простого скрина экрана, сделанного вручную. сначала в файл пишется заголовок, затем "данные" bits, а bmiHeader это не сам заголовок bmp в нашем случае

как я уже написал, оно работает через раз и не везде, а точнее просто белый лист вместо скрина делает. так вот выяснилось, что bits заполняется одними нулями, но не всегда! соответственно если там были одни нули - то выйдет простой белый лист, а если нужные данные то получается полноценный скрин. отсюда и вопрос, почему это просиходит? от чего такая случайность, и в какую сторону копать? спасибо.
Pack вне форума Ответить с цитированием
Старый 18.10.2012, 09:52   #5
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
нуу, мне кажется здесь не особо нужны эти проверки
Вот пока вам так кажется у вас и будет метод через раз работать
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 18.10.2012, 10:00   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

далее, раз скрин экрана то вам нужно GetDC выходит(параметр 0)
и вообще поидее на каждое GetDC/GetWindowDC должен быть ReleaseDC.

а так, вперед ошибки анализировать, лишь потом поговорим.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрин экрана atihiy2010 Общие вопросы Delphi 14 05.05.2012 13:27
Проблема в отображении BMP в Делфи FoggySpurs Помощь студентам 2 23.04.2012 02:57
формат bmp проблема с RGBQUAD androk Общие вопросы C/C++ 0 06.11.2011 14:47
Проблема с TImage, BMP, JPEG Florento Общие вопросы Delphi 5 16.06.2011 16:18
BMP, JPG скриншоты экрана. Большой размер файлов даже с использованием компрессии. Человек_Борща Общие вопросы Delphi 4 05.04.2010 19:10