Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрая графика, Работа с графикой 
V
    Опции темы
костярик
Дата 24.7.2006, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 19.7.2006

Репутация: нет
Всего: нет



Большое спасибо вам за инфу -- как раз то, что надо. Только у меня так и не получилось обратиться к массиву битов. Ваша конструкция p^[j,i].r работать, понятно, не будет: p -- это ж у нас указатель, к тому же нетипизированный, а не массив. Тут надо хитрее поступать. Я пытался работать с массивом цветов двумя способами: как с массивом байтов и как с массивом элементов, типа TRGBTriple. Для этого пришлось объявить новый тип:

  TRGBTripleArray = array [1..10000] of TRGBTriple;
  PRGBTripleArray = ^TRGBTripleArray;

Но это все равно не помогло. На экране ничего не рисуется, даже черный квадрат. Хотя bitblt возвращает true. Вот полностью весь код:
Код

  bmiInfo.bmiHeader.biWidth:=W;
  bmiInfo.bmiHeader.biHeight:=H;
  bmiInfo.bmiHeader.biPlanes:=1;
  bmiInfo.bmiHeader.biBitCount:=24;
  bmiInfo.bmiHeader.biCompression:=BI_RGB;
  bmiInfo.bmiHeader.biSizeImage:=0;
  bmiInfo.bmiHeader.biXPelsPerMeter:=2834;
  bmiInfo.bmiHeader.biYPelsPerMeter:=2834;
  bmiInfo.bmiHeader.biClrUsed:=0;
  bmiInfo.bmiHeader.biClrImportant:=0;
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader);
  DC := CreateCompatibleDC(form1.Canvas.Handle);
  bmDIB := CreateDIBSection(DC, bmiInfo, DIB_RGB_COLORS,
                            Pointer(lpBits), 0, 0);
  bmiInfo.bmiHeader.biWidth:=W;
  bmiInfo.bmiHeader.biHeight:=H;
  bmiInfo.bmiHeader.biPlanes:=1;
  bmiInfo.bmiHeader.biBitCount:=24;
  bmiInfo.bmiHeader.biCompression:=BI_RGB;
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader);
  GetDIBits(DC, bmDIB, 0, H - 1, lpBits, bmiInfo, DIB_RGB_COLORS);
  ellipse(dc, 1, 1, 5, 7); // рисуем эллипс
  bitblt(Canvas.Handle, 0, 0, w, h, dc, 0, 0, SRCCOPY); // пытаемся его отобразить
                                                        // на форме-- не работает!                
  For i := 1 to w do
    for j := 1 to h do
    begin
       // пытаемся обратиться к битам
      PByteArray(lpBits)[(j*w+i)*3+1] := i; // 1.способ
      PRGBTripleArray(lpbits)[j*w+i].rgbtRed :=   random(256); // 2 способ
      PRGBTripleArray(lpbits)[j*w+i].rgbtGreen := random(256); //
      PRGBTripleArray(lpbits)[j*w+i].rgbtBlue :=  random(256); //
    end;
  bitblt(Canvas.Handle, 10, 10, w, h, dc, 0, 0, SRCCOPY);  //  отображаем изменения -- не работает
 
PM MAIL   Вверх
Alexeis
Дата 24.7.2006, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(костярик @  24.7.2006,  10:40 Найти цитируемый пост)
Только у меня так и не получилось обратиться к массиву битов. Ваша конструкция p^[j,i].r работать, понятно, не будет: p -- это ж у нас указатель

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

Добавлено @ 11:25 
Вот рабочий пример!  

Это сообщение отредактировал(а) alexeis1 - 24.7.2006, 11:30

Присоединённый файл ( Кол-во скачиваний: 35 )
Присоединённый файл  load_image_Api.7z 103,20 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 24.7.2006, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



А вот вариант почти как вам надо!
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn1 : TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  b    : TBitmap;


implementation

{$R *.dfm}
          {$O-}
type
  Trgb = packed record
                 b,g,r : byte
                 end;

  arr = array[1..250,1..200] of Trgb;

procedure TForm1.btn1Click(Sender: TObject);
var
 DC : hDC;
 Bitmap : HBITMAP;
 p : ^arr;        //можно удалить
 i, j : integer;  //можно удалить
 bmInfo: TDIBSection;           // структура BITMAP WinAPI
 W, H : Integer;                 // высота и ширина растра
 bmDIB: hBitmap;                // дискрептор независимого растра
 bmiInfo: BITMAPINFO;           // структура BITMAPINFO WinAPI
 lpBits: PRGBTriple;            // указатели на структуры RGBTRIPLE WinAPI

begin
  Bitmap := LoadImage(0,
      'IMG.bmp',
      IMAGE_BITMAP,
      0,
      0,
      LR_DEFAULTSIZE or
      LR_LOADFROMFILE);

  GetObject(Bitmap, SizeOf(bmInfo), @bmInfo);

  DC := CreateCompatibleDC(form1.Canvas.Handle);
  SelectObject(DC, Bitmap);

  W := bmInfo.dsBm.bmWidth;
  H := bmInfo.dsBm.bmHeight;

  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота    
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель    
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компрессии
  bmiInfo.bmiHeader.biSizeImage:=0;        // размер не знаем, ставим в ноль    
  bmiInfo.bmiHeader.biXPelsPerMeter:=2834; // пикселей на метр, гор.
  bmiInfo.bmiHeader.biYPelsPerMeter:=2834; // пикселей на метр, верт.    
  bmiInfo.bmiHeader.biClrUsed:=0;          // палитры нет, все в ноль
  bmiInfo.bmiHeader.biClrImportant:=0;     // то же    
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структруы
  bmDIB := CreateDIBSection(DC, bmiInfo, DIB_RGB_COLORS,
  Pointer(lpBits), 0, 0);
  //создаем независимый растр WxHx24, без палитры, в указателе lpBits получаем    
  //адрес первого байта этого растра. bmDIB - дискрептор растра
  //заполняем первые шесть членов BITMAPINFO для передачи в GetDIBits    
  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота    
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель    
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компресси
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структуры    
  GetDIBits(DC, Bitmap, 0, H - 1, lpBits, bmiInfo, DIB_RGB_COLORS);

  p := Pointer(lpBits); //это мой вариант с выводом на форму

  ellipse(dc, 1, 1, 50, 17);
  BitBlt(Canvas.Handle, 0, 0, w, h, DC, 0, 0, SRCCOPY);
end;


Добавлено @ 11:53 
Вот тут вообще без загрузки изображения
+ Вывод при помощи bitblt
+ Вывод попиксельно из памяти указанной в p из того же битмапа
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    btn1 : TButton;
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  b    : TBitmap;


implementation

{$R *.dfm}
          {$O-}
type
  Trgb = packed record
                 b,g,r : byte
                 end;

  arr = array[1..250,1..200] of Trgb;

procedure TForm1.btn1Click(Sender: TObject);
var
 DC : hDC;
 Bitmap : HBITMAP;
 p : ^arr;        //можно удалить
 i, j : integer;  //можно удалить
 bmInfo: TDIBSection;           // структура BITMAP WinAPI
 W, H : Integer;                 // высота и ширина растра
 bmDIB: hBitmap;                // дискрептор независимого растра
 bmiInfo: BITMAPINFO;           // структура BITMAPINFO WinAPI
 lpBits: PRGBTriple;            // указатели на структуры RGBTRIPLE WinAPI

begin
  DC := CreateCompatibleDC(form1.Canvas.Handle);

  W := 200;
  H := 250;

  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компрессии
  bmiInfo.bmiHeader.biSizeImage:=0;        // размер не знаем, ставим в ноль
  bmiInfo.bmiHeader.biXPelsPerMeter:=2834; // пикселей на метр, гор.
  bmiInfo.bmiHeader.biYPelsPerMeter:=2834; // пикселей на метр, верт.
  bmiInfo.bmiHeader.biClrUsed:=0;          // палитры нет, все в ноль
  bmiInfo.bmiHeader.biClrImportant:=0;     // то же
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структруы
  bmDIB := CreateDIBSection(DC, bmiInfo, DIB_RGB_COLORS,
  Pointer(lpBits), 0, 0);

  SelectObject(DC, bmDIB);

  //создаем независимый растр WxHx24, без палитры, в указателе lpBits получаем
  //адрес первого байта этого растра. bmDIB - дискрептор растра
  //заполняем первые шесть членов BITMAPINFO для передачи в GetDIBits
  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компресси
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структуры
  GetDIBits(DC, Bitmap, 0, H - 1, lpBits, bmiInfo, DIB_RGB_COLORS);

  p := Pointer(lpBits); //это мой вариант с выводом на форму

  ellipse(dc, 1, 1, 140, 170);
  BitBlt(Canvas.Handle, 220, 0, w, h, DC, 0, 0, SRCCOPY);

  For i := 1 to 200 do
  for j := 1 to 250 do
   form1.Canvas.Pixels[i, 250 - j] := RGB(p^[j,i].r, p^[j,i].g, p^[j,i].b);
end;



end.

 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
welt
Дата 14.6.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 21.5.2005
Где: UnderGround

Репутация: нет
Всего: нет



Alexeis
Ну я немного поправлю. Все-таки нехорошо, когда для разных картинок надо 
каждый раз вручную задавать границы массива
Код

 arr = array[1..250,1..200] of Trgb;


Я доработал код таким образом:

Код


type
  Trgb = packed record
   b,g,r : byte
   end;
const
  MaxPixelCountA = MaxInt div Sizeof(TRGB);
type
  arr = array [0..MaxPixelCountA - 1] of TRGB;

procedure TForm1.btn1Click(Sender: TObject);
var
 DC : hDC;
 Bitmap : HBITMAP;
 p : ^arr;        //можно удалить
 i, j : integer;  //можно удалить
 bmInfo: TDIBSection;           // структура BITMAP WinAPI
 W, H : Integer;                 // высота и ширина растра
 bmDIB: hBitmap;                // дискрептор независимого растра
 bmiInfo: BITMAPINFO;           // структура BITMAPINFO WinAPI
 lpBits: PRGBTriple;            // указатели на структуры RGBTRIPLE WinAPI

var
hBDC : HDC;

begin
  DC := Form1.Canvas.Handle; {DC := GetDC(Handle)
                              Handle - окна вывода(или любого)}
  Bitmap := LoadImage(0,
      'img.bmp',
      IMAGE_BITMAP,
      0,
      0,
      LR_DEFAULTSIZE or
      LR_LOADFROMFILE);

  GetObject(Bitmap, SizeOf(bmInfo), @bmInfo);
  W := bmInfo.dsBm.bmWidth;
  H := bmInfo.dsBm.bmHeight;
  hBDC := CreateCompatibleDC(dc);
  SelectObject(hBDC, Bitmap);
  BitBlt(dc, 0, 0, w, h, hBDC, 0, 0, SRCCOPY);

  bmiInfo.bmiHeader.biWidth:=W;            // ширина
  bmiInfo.bmiHeader.biHeight:=H;           // высота
  bmiInfo.bmiHeader.biPlanes:=1;           // всегда 1
  bmiInfo.bmiHeader.biBitCount:=24;        // три байта на пиксель
  bmiInfo.bmiHeader.biCompression:=BI_RGB; // без компрессии
  bmiInfo.bmiHeader.biSizeImage:=0;        // размер не знаем, ставим в ноль
  bmiInfo.bmiHeader.biXPelsPerMeter:=2834; // пикселей на метр, гор.
  bmiInfo.bmiHeader.biYPelsPerMeter:=2834; // пикселей на метр, верт.
  bmiInfo.bmiHeader.biClrUsed:=0;          // палитры нет, все в ноль
  bmiInfo.bmiHeader.biClrImportant:=0;     // то же
  bmiInfo.bmiHeader.biSize:=SizeOf(bmiInfo.bmiHeader); // размер структруы
  bmDIB := CreateDIBSection(DC, bmiInfo, DIB_RGB_COLORS,
  Pointer(lpBits), 0, 0);

  GetMem(p, w*h*sizeof(Trgb));
  GetDIBits(DC, Bitmap, 0, H - 1, lpBits, bmiInfo, DIB_RGB_COLORS);
  p := Pointer(lpBits); //

 {
  For i := 1 to W do  //Вывод на форму
   for j := 1 to H do  //Можно удалить
    form1.Canvas.Pixels[i, H - j] := RGB(p^[i + w * j].r, p^[i + w * j].g, p^[i + w * j].b);
 }
end;


PM MAIL   Вверх
Alexeis
Дата 14.6.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(welt @  14.6.2009,  00:42 Найти цитируемый пост)
Ну я немного поправлю. Все-таки нехорошо, когда для разных картинок надо 
каждый раз вручную задавать границы массива

  Главное, что ясна суть, так нагляднее видно что это матрица, а под свою задачу каждый пусть переделывает сам  smile 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
AntonN
Дата 14.6.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

Репутация: 7
Всего: 18



поправил спустя почти 3 года  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0830 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.