Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Быстрый доступ к пикселям (в памяти?(как сделать?)


Автор: zogman 30.1.2005, 16:21
Помогите !
Как мне быстро работать с картинкой ?
(Мне достаточно работы с образом картинки в памяти,
дело не в прорисовке).

TBitmap->Canvas->Pixels[i][j]=...
- работает медленней раз в 30 чем
если бы это был просто массив в ОЗУ.

Я бы хотел считать картинку в память,
а потом работать с ней по пикселям.
**************************
Второй вопрос :

Как мне найти где лежат в памяти байты картинки
после считывания?
т.е.
я ее считал через
Graphics::TBitmap *bmp;
bmp=new Graphics::TBitmap();
bmp->LoadFromFile("a.bmp");

Как мне найти где лежат BITMAPFILEHEADER
BITMAPINFOHEADER ?

Автор: Kesh 30.1.2005, 17:16
А Canvas.Lock - Canvas.Unlock ты не пробовал...

Автор: Illusion Dolphin 30.1.2005, 22:28
А как же метод
Код

bmp->ScanLine[Line_Number]
?

Кроме всего, если тебе интересна структура файла, то вот:
Цитата


--------------------------------------------------------------------------------

Структура Bmp-файла
Имя Длина Смещение Описание
Заголовок файла (BitMapFileHeader)
Type 2 0 Сигнатура "BM"
Size 4 2 Размер файла
Reserved 1 2 6 Зарезервировано
Reserved 2 2 8 Зарезервировано
OffsetBits 4 10 Смещение изображения от начала файла
Информационный заголовок (BitMapInfoHeader)
Size 4 14 Длина заголовка
Width 4 18 Ширина изображения, точки
Height 4 22 Высота изображения, точки
Planes 2 26 Число плоскостей
BitCount 2 28 Глубина цвета, бит на точку
Compression 4 30 Тип компрессии (0 - несжатое изображение)
SizeImage 4 34 Размер изображения, байт
XpelsPerMeter 4 38 Горизонтальное разрешение, точки на метр
YpelsPerMeter 4 42 Вертикальное разрешение, точки на метр
ColorsUsed 4 46 Число используемых цветов (0 - максимально возможное для данной глубины цвета)
ColorsImportant 4 50 Число основных цветов
Таблица цветов (палитра) (ColorTable)
ColorTable 1024 54 256 элементов по 4 байта
Данные изображения (BitMap Array)
Image Size 1078 Изображение, записанное по строкам слева направо и снизу вверх



--------------------------------------------------------------------------------

Листинг 1
unit bmpread; {процедуры для работы с Bmp}
interface
type
  artype = array[0..0]of byte;
  arptr = ^artype;
  bmFileHeader = record {заголовок файла}
    Typf : word;        {сигнатура }
    Size : longint;    {длина файла в байтах}
    Res1 : word;        {зарезервировано}
    Res2 : word;        {зарезервировано}
    OfBm : longint;    {смещение изображения в байтах (1078)}
  end;
  bmInfoHeader = record  {информационный заголовок}
    Size : longint;      {длина заголовка в байтах (40)}
    Widt : longint;      {ширина изображения (в точках)}
    Heig : longint;      {высота изображения (в точках)}
    Plan : word;          {число плоскостей (1)}
    BitC : word;          {глубина цвета (бит на точку) (8)}
    Comp : longint;      {тип компрессии (0 - нет)}
    SizI : longint;      {размер изображения в байтах}
    XppM : longint;      {горизонтальное разрешение}
            {(точек на метр - обычно 0)}
    YppM : longint;      {вертикальное разрешение}
            {(точек на метр - обычно 0)}
    NCoL : longint;      {число цветов}
            {(если максимально допустимое - 0)}
    NCoI : longint;      {число основных цветов}
  end;                 
  bmHeader = record      {полный заголовок файла}
    f : bmFileHeader;    {заголовок файла}
    i : bmInfoHeader;    {информационный заголовок}
    p : array[0..255,0..3]of byte; {таблица палитры}
  end;

  bmhptr = ^bmHeader;

{чтение изображения из Bmp-файла}
procedure ReadBMP(image:arptr;      {массив с изображением}
                  xim,yim:word;    {размеры}
                  pal:arptr;    {палитра}
                  filename:string); {имя файла}

{чтение заголовка Bmp-файла}
procedure ReadBMPheader(header:bmhptr;filename:string);

implementation

{$R-}

{чтение изображения из Bmp-файла}
procedure ReadBMP(image:arptr; xim,yim:word;
                  pal:arptr; filename:string);
var
  h  : bmHeader;
  i  : integer;
  bmpfile : file;
  s  : longint;
begin
  assign(bmpfile,filename);
  reset(bmpfile,1);
  blockread(bmpfile,h,sizeof(h));  {чтение заголовка}
  for i := 0 to yim-1 do begin    {построчное чтение}
    blockread(bmpfile,image^[(yim-i-1)*xim],xim);
    if (xim mod 4) <> 0 then
      blockread(bmpfile,s,4 - (xim mod 4));
  end;
  close(bmpfile);
  for i ^= 0 to 255 do begin      {преобразование палитры}
    pal^[i*3+2] := h.p[i,0] shr 2; {синий}
    pal^[i*3+1] := h.p[i,1] shr 2; {зеленый}
    pal^[i*3+0] := h.p[i,2] shr 2; {красный}
  end;
end;

{чтение заголовка Bmp-файла}
procedure ReadBMPheader(header:bmhptr;filename:string);
var
  bmpfile:file;
begin
  assign(bmpfile,filename);
  reset(bmpfile,1);
  blockread(bmpfile,header^,sizeof(header^));
  close(bmpfile);
end;

end.

Автор: zogman 31.1.2005, 17:31
Можно пожалуйста объяснить для тупых чайников.

(Я более менее понимаю структуру заголвка БМП файла)
НО не понимаю как мне ее извлечь из класса
Graphics::TBitmap *bmp; ??????

ПС

У меня Билдер 97года
я там не вижу ни "bmp->ScanLine[Line_Number]"
ни "Canvas.Lock - Canvas.Unlock". Это я плохо смотрю или
это в новых только ?




Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)