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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2013, 16:34   #1
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию bitmap отображение на форме проверьте код

Добрый день!
я писал одну программку с созданием и отображением битмапа в с++, теперь хочу разобраться как в делфи.

написал вот такой код:
Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
const ind=324*256*3;
var cross:HBITMAP;
    Frame:array[0..ind]of Integer ;
    i,index:Integer;
    Dc,M: HWnd;
    bmi:BITMAPINFO;
    //bmheader:BITMAPINFOHEADER;
    mass:Integer;
    pixcount,height:Integer;
    fullpix:Integer;
    //bm:BITMAP;
     //: hdc; {used to convert the DOB to a DDB}

begin
  bmi.bmiHeader.biSize:=SizeOf(BITMAPINFOHEADER);
  bmi.bmiHeader.biBitCount := 32;
  bmi.bmiHeader.biHeight := 256;
  bmi.bmiHeader.biWidth := 324;
  bmi.bmiHeader.biPlanes :=1;
	bmi.bmiHeader.biXPelsPerMeter:=0;
	bmi.bmiHeader.biYPelsPerMeter:=0;
pixcount:=324*256;
for mass:=0 to pixcount do begin
Frame[mass]:=160;
end;

{for height:=0 to 256 do begin
  fullpix:= (height+1)*324;
  i:=height*324;
for index:=i to fullpix do begin
Frame[index]:=height;
end;end;}

cross := CreateBitmap(324,256,1,32,@Frame);
{cross:=LoadImage(GetModuleHandle(nil),'cross4.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//ãðóçèì áèòìàï
        }
    DC:=GetDC(Form1.Handle);//áåðåì êîíòåêñò ôîðìû
    M:=CreateCompatibleDC(DC);//ñîçäàåì âðåìåííûé êîíòåêñò
    SelectObject(M,cross);//ïðèìåíÿåì ê íåìó íàø áèòìàï
    GetObject(cross,sizeof(BITMAPINFOHEADER),@bmi);//áåðåì äàííûå áèòìàïàf
    BitBlt(DC,324, 256,64,64,M,0,0,SRCCOPY);//ðèñóåì áèòìàï íà êîíòåêñòå ôîðìû(èñïîëüçóÿ øèðèíó è âûñîòó)
    DeleteDC(M);//ñòèðàåì âðåìåííûé êîíòåêñò


end;
но ничего не отображается...в чем дело, подскажите
hunter03 вне форума Ответить с цитированием
Старый 13.08.2013, 16:37   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Цитата:
я писал одну программку с созданием и отображением битмапа в с++, теперь хочу разобраться как в делфи.
А в Delphi все просто. Подключите модуль Graphics(обычно он стандартно подключен в VCL проекте) и оттуда используйте класс TBitmap
Код:
var
 bmp:TBitmap;
begin
 bmp:=TBitmap.Create;
 try
 bmp.LOadFromFile('lolfile.bmp');
  .... 
  finally
   FreeAndNil(bmp);
  end;
end;
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2013, 16:39   #3
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

а если битмам создать из массива пикселей?
его ж сначала нужно создать, залить цветом, и вывести, верно?

нет, мне не из файла нужно получить битмап, это сильно просто, как сделать из сгенерированного программно.?

есть такая штука
Код:
bmp.ReleaseHandle
ее использовать?

Последний раз редактировалось hunter03; 13.08.2013 в 16:43.
hunter03 вне форума Ответить с цитированием
Старый 13.08.2013, 16:50   #4
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

я так понимаю используя TBitmap нельзя создать битмап программно?
hunter03 вне форума Ответить с цитированием
Старый 13.08.2013, 16:56   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Можно, все можно легко и просто.

Создали TBitmap - все, у вас есть BMP файл, и он пустой.
TBitmap.Canvas - тут рисуем
TBtimap.Width - уст. ширину
TBtimap.Heght - уст. высоту
Человек_Борща вне форума Ответить с цитированием
Старый 13.08.2013, 17:10   #6
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

ага, спасибо!
Еще 1 вопрос, у меня в массиве хранятся значения от 0 до 255..если я напишу, например :
Код:
  bmp.Canvas.Pixels[row,col]:=255;
то цвет будет какой то красный, а не белый...
как это преобразовать?
hunter03 вне форума Ответить с цитированием
Старый 13.08.2013, 17:18   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

PixelFormat=pf8bit
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.08.2013, 17:24   #8
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

не помогает эта функция...цвета поменялись но не получается 255 белым


Проблема решается следующим способом:

Код:
bmp.Canvas.Pixels[row,col]:=RGB(Frame[row*256+col],Frame[row*256+col],Frame[row*256+col]);
Спасибо всем, кто откликнулся!!!!

Последний раз редактировалось hunter03; 13.08.2013 в 17:31.
hunter03 вне форума Ответить с цитированием
Старый 14.08.2013, 13:04   #9
hunter03
Форумчанин
 
Регистрация: 05.05.2009
Сообщений: 244
По умолчанию

из за того, что Pixels очень долго рисует, решил сделать по другому с api функциями

нашел следующий код:
Код:
type
  {Used for pointer math under Win16}
  PPtrRec = ^TPtrRec;
  TPtrRec = record
    Lo: Word;
    Hi: Word;
end;
{$ENDIF}

{Used for huge pointer math}
function GetBigPointer(lp: pointer; Offset: Longint): Pointer;
begin
  {$IFDEF WIN32}
  GetBigPointer := @PByteArray(lp)^[Offset];
  {$ELSE}
  Offset := Offset + TPtrRec(lp).Lo;
  GetBigPointer := Ptr(TPtrRec(lp).Hi + TPtrRec(Offset).Hi *
  SelectorInc,
  TPtrRec(Offset).Lo);
  {$ENDIF}
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  hPixelBuffer : THandle; {Handle to the pixel buffer}
  lpPixelBuffer : pointer; {pointer to the pixel buffer}
  lpPalBuffer : PLogPalette; {The palette buffer}
  lpBitmapInfo : PBitmapInfo; {The bitmap info header}
  BitmapInfoSize : longint; {Size of the bitmap info header}
  BitmapSize : longint; {Size of the pixel array}
  PaletteSize : integer; {Size of the palette buffer}
  i : longint; {loop variable}
  j : longint; {loop variable}
  OldPal : hPalette; {temp palette}
  hPal : hPalette; {handle to our palette}
  hBm : hBitmap; {handle to our bitmap}
  Bm : TBitmap; {temporary TBitmap}
  Dc : hdc; {used to convert the DOB to a DDB}
  IsPaletteDevice : bool;
  cross:HBITMAP;
  Dcc,M: HWnd;
begin
  Application.ProcessMessages;
  
  {$IFOPT R+}
  {$DEFINE CKRANGE}
  {$R-}
  {$ENDIF}

 
  dc := GetDc(0);
  IsPaletteDevice :=
  GetDeviceCaps(dc, RASTERCAPS) and RC_PALETTE = RC_PALETTE;
  {Give back the screen dc}
  dc := ReleaseDc(0, dc);


  BitmapInfoSize := sizeof(TBitmapInfo) + (sizeof(TRGBQUAD) * 255);

  {The bitmap size must be the width of the bitmap rounded}
  {up to the nearest 32 bit boundary}
  BitmapSize := (sizeof(byte) * 256) * 256;


  if IsPaletteDevice then
    PaletteSize := sizeof(TLogPalette) + (sizeof(TPaletteEntry) * 255);

  
  GetMem(lpBitmapInfo, BitmapInfoSize);
  hPixelBuffer := GlobalAlloc(GHND, BitmapSize);
  lpPixelBuffer := GlobalLock(hPixelBuffer);

  if IsPaletteDevice then
    GetMem(lpPalBuffer, PaletteSize);

  {Çàïîëíÿåì íóëÿìè BitmapInfo, PixelBuffer, è Palette}
  FillChar(lpBitmapInfo^, BitmapInfoSize, #0);
  FillChar(lpPixelBuffer^, BitmapSize, #0);
  if IsPaletteDevice then
    FillChar(lpPalBuffer^,PaletteSize, #0);

  {Çàïîëíÿåì ñòðóêòóðó BitmapInfo}
  lpBitmapInfo^.bmiHeader.biSize := sizeof(TBitmapInfoHeader);
  lpBitmapInfo^.bmiHeader.biWidth := 256;
  lpBitmapInfo^.bmiHeader.biHeight := 256;
  lpBitmapInfo^.bmiHeader.biPlanes := 1;
  lpBitmapInfo^.bmiHeader.biBitCount := 8;
  lpBitmapInfo^.bmiHeader.biCompression := BI_RGB;
  lpBitmapInfo^.bmiHeader.biSizeImage := BitmapSize;
  lpBitmapInfo^.bmiHeader.biXPelsPerMeter := 0;
  lpBitmapInfo^.bmiHeader.biYPelsPerMeter := 0;
  lpBitmapInfo^.bmiHeader.biClrUsed := 256;
  lpBitmapInfo^.bmiHeader.biClrImportant := 256;

  for i := 0 to 255 do
  begin
    lpBitmapInfo^.bmiColors[i].rgbRed := i;
    lpBitmapInfo^.bmiColors[i].rgbGreen := i;
    lpBitmapInfo^.bmiColors[i].rgbBlue := i;
  end;

  cross := CreateBitmap(256,256,1,8,lpBitmapInfo);
{cross:=LoadImage(GetModuleHandle(nil),'cross4.bmp',IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//a?ocei aeoiai
        }
    DC:=GetDC(Form1.Handle);//aa?ai eiioaeno oi?iu
    M:=CreateCompatibleDC(DC);//nicaaai a?aiaiiue eiioaeno
    SelectObject(M,cross);//i?eiaiyai e iaio iao aeoiai
    GetObject(cross,sizeof(lpBitmapInfo),@lpBitmapInfo^.bmiHeader);//aa?ai aaiiua aeoiaiaf
    BitBlt(DC,324, 256,256,256,M,0,0,SRCCOPY);//?enoai aeoiai ia eiioaenoa oi?iu(eniieucoy oe?eio e aunioo)
    DeleteDC(M);//noe?aai a?aiaiiue eiioaeno

end;
пытаюсь это так отобразить на форме...но ничего....
помогите, как это отобразить...не пойму что не так...

Последний раз редактировалось hunter03; 14.08.2013 в 13:06.
hunter03 вне форума Ответить с цитированием
Старый 14.08.2013, 13:14   #10
Slym
Участник клуба
 
Регистрация: 07.12.2011
Сообщений: 1,025
По умолчанию

bmp.Canvas.Pixels - долго
Bitmap.ScanLine - в помощь
Не стесняемся, плюсуем!
Slym вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение диаграммы на форме Нездешний2000 C# (си шарп) 2 25.11.2011 00:30
Отображение ярлыков на форме berlios Общие вопросы Delphi 20 26.12.2010 04:53
Отображение на главной форме Gamst Общие вопросы Delphi 3 26.05.2010 01:34
Отображение на главной форме Gamst Помощь студентам 1 26.05.2010 01:28
Отображение файлов tif на форме AlexandrSid Общие вопросы Delphi 7 28.05.2009 16:15