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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #16  
Старый 15.11.2011, 22:07
monax_111 monax_111 вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 11
Репутация: 10
По умолчанию

Цитата:
Сообщение от angvelem
Дай-ка свой битмап.

http://zalil.ru/32064314
Ответить с цитированием
  #17  
Старый 16.11.2011, 00:25
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

И что не получается?
Код:
var
  Bitmap : TBitmap;
  Bits   : array of Byte;
...
var
  bi : PBITMAPINFO;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('C:\000.bmp');
    GetMem(bi, SizeOf(TBitmapInfo));
    try
      FillChar(bi^, SizeOf(TBITMAPINFO), 0);
      with bi^.bmiHeader do
      begin
        biSize          := SizeOf(TBITMAPINFOHEADER);
        biWidth         := Bitmap.Width;
        biHeight        := Bitmap.Height;
        biPlanes        := 1;
        biBitCount      := 24;
        biCompression   := BI_RGB;
      end;

      SetLength(Bits, Bitmap.Width * Bitmap.Height * (bi^.bmiHeader.biBitCount shr 3));
      GetDIBits(Bitmap.Canvas.Handle, Bitmap.Handle, 0, Bitmap.Height, Bits, TBitmapInfo(bi^), DIB_RGB_COLORS);
    finally
      FreeMem(bi, SizeOf(TBitmapInfo));
    end;
  finally
    Bitmap.Free;
  end;
end;
всё работает.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #18  
Старый 16.11.2011, 00:44
monax_111 monax_111 вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 11
Репутация: 10
Печаль

Цитата:
Сообщение от angvelem
И что не получается?
Код:
var
  Bitmap : TBitmap;
  Bits   : array of Byte;
...
var
  bi : PBITMAPINFO;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('C:\000.bmp');
    GetMem(bi, SizeOf(TBitmapInfo));
    try
      FillChar(bi^, SizeOf(TBITMAPINFO), 0);
      with bi^.bmiHeader do
      begin
        biSize          := SizeOf(TBITMAPINFOHEADER);
        biWidth         := Bitmap.Width;
        biHeight        := Bitmap.Height;
        biPlanes        := 1;
        biBitCount      := 24;
        biCompression   := BI_RGB;
      end;

      SetLength(Bits, Bitmap.Width * Bitmap.Height * (bi^.bmiHeader.biBitCount shr 3));
      GetDIBits(Bitmap.Canvas.Handle, Bitmap.Handle, 0, Bitmap.Height, Bits, TBitmapInfo(bi^), DIB_RGB_COLORS);
    finally
      FreeMem(bi, SizeOf(TBitmapInfo));
    end;
  finally
    Bitmap.Free;
  end;
end;
всё работает.


1) Апринципиально ставить try?? Что произойдет/не произойдет, если его не поставить???
2) зачем после bi ставить ^?? Это же служит для определения значения объекта, на который идет ссылка???
Ответить с цитированием
  #19  
Старый 16.11.2011, 00:48
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

1. Можешь конечно и не ставить, но... размер exe-файла от этого принципиально не изменится, а от разных, непредвиденных косяков убережёт.
2. bi : PBITMAPINFO - первая буква P, указывает на то, что это указатель на BITMAPINFO.
P.S. Можешь всё переделать по-своему.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
  #20  
Старый 16.11.2011, 15:11
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Цитата:
Сообщение от monax_111
чето не выходит

http://msdn.microsoft.com/en-us/libr...S.85%29.aspxне

то поле заполнил
Код:
ABitmap:=TBitmap.Create;
    ABitmap.LoadFromFile('D:\тим\шаг\000.bmp');
    ADC:=CreateCompatibleDC(0);
      ZeroMemory(@ABitmapInfo.bmiHeader, SizeOf(TBitmapInfoHeader));
      ABitmapInfo.bmiHeader.biSize:=SizeOf(TBitmapInfoHeader);
//--------------------------------------
      abitmapinfo.bmiHeader.biClrUsed:=0;(*это поле нужно для битмапов с палитрой , а в вашем случае должен быть 0*)
//--------------------------------------
      abitmapinfo.bmiHeader.biBitCount:=24;(* а нужно вот это*)
//--------------------------------------
      abitmapinfo.bmiHeader.biWidth:=1000;
      abitmapinfo.bmiHeader.biHeight:=750;
      abitmapinfo.bmiHeader.biPlanes:=1;
      abitmapinfo.bmiHeader.biSizeImage:=2250000;
      abitmapinfo.bmiHeader.biClrImportant:=0;
//-------------------------------------------
(* здесь должно быть указано количество пикселей на дюйм*)
      abitmapinfo.bmiHeader.biXPelsPerMeter:=96;(* по горизонтали *)
      abitmapinfo.bmiHeader.biYPelsPerMeter:=96;(*  и по вертикали *)
      SetLength(lpvBits, 2250000);
      GetDIBits(ADC, ABitmap.Handle, 0, 750, lpvBits, ABitmapInfo, DIB_RGB_COLORS);
          // lpvBits: array [0..ABitmapInfo.bmiHeader.biSizeImage-1] of R, G, B; - условно
      DeleteDC(ADC) ;
    ABitmap.Free;

чето я наверно не то рками делаю, массив из нулей((([/quote]
Ответить с цитированием
  #21  
Старый 16.11.2011, 18:16
monax_111 monax_111 вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 11
Репутация: 10
Счастье

Цитата:
Сообщение от angvelem
И что не получается?
Код:
var
  Bitmap : TBitmap;
  Bits   : array of Byte;
...
var
  bi : PBITMAPINFO;
begin
  Bitmap := TBitmap.Create;
  try
    Bitmap.LoadFromFile('C:\000.bmp');
    GetMem(bi, SizeOf(TBitmapInfo));
    try
      FillChar(bi^, SizeOf(TBITMAPINFO), 0);
      with bi^.bmiHeader do
      begin
        biSize          := SizeOf(TBITMAPINFOHEADER);
        biWidth         := Bitmap.Width;
        biHeight        := Bitmap.Height;
        biPlanes        := 1;
        biBitCount      := 24;
        biCompression   := BI_RGB;
      end;

      SetLength(Bits, Bitmap.Width * Bitmap.Height * (bi^.bmiHeader.biBitCount shr 3));
      GetDIBits(Bitmap.Canvas.Handle, Bitmap.Handle, 0, Bitmap.Height, Bits, TBitmapInfo(bi^), DIB_RGB_COLORS);
    finally
      FreeMem(bi, SizeOf(TBitmapInfo));
    end;
  finally
    Bitmap.Free;
  end;
end;
всё работает.

прям уличная магия))) все работает!!)) хотя я попробовал заменить bi на просто битмапинфо, но мне стал getmem ругаться когда я ему написал @bitmapinfo(((
Ответить с цитированием
  #22  
Старый 16.11.2011, 18:46
monax_111 monax_111 вне форума
Прохожий
 
Регистрация: 13.11.2011
Сообщения: 11
Репутация: 10
Печаль

а как обратно??? из массива в битмап?
Ответить с цитированием
  #23  
Старый 16.11.2011, 21:49
Аватар для angvelem
angvelem angvelem вне форума
.
 
Регистрация: 18.05.2011
Адрес: Омск
Сообщения: 3,970
Версия Delphi: 3,5,7,10,12,XE2
Репутация: выкл
По умолчанию

Уже писали выше: SetDIBits.
__________________
Je venus de nulle part
55.026263 с.ш., 73.397636 в.д.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter