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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TBitmap из массива байт 
:(
    Опции темы
Proxin
Дата 17.12.2011, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Такая проблема. У меня есть массив байт размером 3*ШиринаКартинки*ВысотаКартинки (uint8), считанный из файла, известна ширина и высота картинки, которая должна получиться. Как можно его отобразить в TBitmap? Гуглил, ничего не нашёл. Пробовал через setdibits, но не разобрался с параметрами этой функции.

Это сообщение отредактировал(а) Proxin - 17.12.2011, 18:10
PM MAIL   Вверх
MetalFan
Дата 17.12.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Proxin, ну если делать влоб, то создаешь TBitmap, устанавливаешь битность и размер, ну и вперед, по scanline)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Proxin
Дата 17.12.2011, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Массив у меня одномерный. И к тому же scanline это read-оnly property. Как ей пользоваться, я не понимаю. Для одномерного массива она не подходит. Мне бы внятный пример на stdibits.

Это сообщение отредактировал(а) Proxin - 17.12.2011, 23:06
PM MAIL   Вверх
MetalFan
Дата 18.12.2011, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Proxin, ну и что, что одномерный? тебе его надо "разложить" в "линии" изображения, правильно я понимаю? Примеры работы со св-вом scanline поищи по форуму или в инете, там ничего сложного нет.
Возможно можно как-то и по-проще, но я не в курсе как)


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Proxin
Дата 18.12.2011, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Извратился по-старинке, попиксельно сделал rgb. Всё же интресует, как это делают цивилизованные люди.
upd. Добавлю, что использование SetDiBits по вот этой функции:
Код

procedure SetDIBitsToBitmap32 ( const bmp : TBitmap; const a_iWidth, a_iHeight : integer; var p : pointer );
var
 bi  : TBitmapInfo;
 res : integer;
 error : cardinal;

begin
 FillChar (bi,SizeOf(bi),0);
 with bi.bmiHeader do
 begin
     biSize := SizeOf(bi.bmiHeader);
     biWidth := a_iWidth;
     biHeight := a_iHeight;
     biPlanes := 1;
     biBitCount := 32;
     biCompression := BI_RGB;
 end;

 // now set the bits
 res := SetDIBits(bmp.Canvas.Handle, bmp.Handle, 0, a_iHeight, p, bi, DIB_RGB_COLORS);
 if res = 0 then
 begin
     error := GetLastError;
     raise Exception.Create('clBMPHelper.SetDIBitsToBitmap32: Cannot set Bitmap data with SetDIBits'#13#10+
                            'Error '+IntToStr(error)+': '+GetErrorString(error));
 end;
end;

выдаёт неправильный рисунок, точнее, какую-то мешанину из пикселей. Функция не моя, я её нашёл. Что в ней не так?

Это сообщение отредактировал(а) Proxin - 18.12.2011, 01:04
PM MAIL   Вверх
MetalFan
Дата 18.12.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(Proxin @  18.12.2011,  00:35 Найти цитируемый пост)
biBitCount := 32;


Цитата(Proxin @  17.12.2011,  18:07 Найти цитируемый пост)
есть массив байт размером 3*ШиринаКартинки*ВысотаКартинки


соотв. возможно поможет:
Код

iBitCount := 24;




--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Illusion Dolphin
Дата 25.12.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Вот как раз позавчера писал smile Не оптимально, но для смысла пойдёт.

Код


type
  TRGB = record
    B, G, R : Byte;
  end;

  ARGB = array [0..32677] of TRGB;
  PARGB = ^ARGB;
  PRGB = ^TRGB;
  PARGBArray = array of PARGB;

  TRGB32 = record
    B, G, R, L : byte;
  end;

  ARGB32 = array [0..32677] of TRGB32;
  PARGB32 = ^ARGB32;
  PRGB32 = ^TRGB32;
  PARGB32Array = array of PARGB32;

  procedure ReadBitmapFromBuffer(Buffer: Pointer; Bitmap: TBitmap; W, H: Integer);
  var
    I, J: Integer;
    P: PARGB;
    PS: PRGB;
    Addr, Line: Integer;
  begin
    Bitmap.PixelFormat := pf24bit;
    Bitmap.SetSize(W, H);

    Line := W * 3;
    for I := 0 to H - 1 do
    begin
      P := Bitmap.ScanLine[H - I - 1];
      for J := 0 to W - 1 do
      begin
        Addr := Integer(Buffer) + I * Line + J * 3;
        PS := PRGB(Addr);
        P[J] := PS^;
      end;
    end;


P.S. Может Вы WIA копаете?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

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


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

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


 




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


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

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