[Решено] Заполнение TBitMap из массива байт

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[Решено] Заполнение TBitMap из массива байт

Сообщение kotompazb » 02.11.2015 23:34:55

Ну то есть допустим, есть у меня массив, заполненный данными самой пиксельной матрицы в определенном формате, как мне заполнить из него TBitMap, чтобы потом отобразить, например, его на TImage?
В этом я совсем ничего не понимаю.
Единственная мысль у меня - заполнить в памяти массив 1 в 1 копирующий содержимое bmp-файла.
Последний раз редактировалось kotompazb 05.11.2015 11:03:45, всего редактировалось 1 раз.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Заполнение TBitMap из массива байт

Сообщение resident » 02.11.2015 23:48:26

resident
энтузиаст
 
Сообщения: 605
Зарегистрирован: 13.03.2013 16:58:51

Re: Заполнение TBitMap из массива байт

Сообщение Pavia » 03.11.2015 00:15:42

Используй TBitmap.RawImage.Data
Формат зависит от платформы(ОС).
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Re: Заполнение TBitMap из массива байт

Сообщение kotompazb » 03.11.2015 10:28:57

Всем спасибо.
Может это и костыли, но учитывая, что размеры картинок и глубина цвета (bpp) в моем случае всегда одна и та же, я просто заполняю, как и написал ниже, bmp, сохраняю его в MemoryStream, а потом загружаю его оттуда. Думаю, так должно работать везде.
Щас еще хочу поковырять форматы png и gif, дабы реализовать возможность сохранения в них полученной картинки.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Заполнение TBitMap из массива байт

Сообщение Mikhail » 03.11.2015 11:11:28

kotompazb писал(а):Щас еще хочу поковырять форматы png и gif, дабы реализовать возможность сохранения в них полученной картинки.

Разве так не работает?
Код: Выделить всё
pngImage.Assign(Bitmap);
Mikhail
энтузиаст
 
Сообщения: 565
Зарегистрирован: 24.10.2013 16:06:47

Re: Заполнение TBitMap из массива байт

Сообщение kotompazb » 03.11.2015 11:31:47

Mikhail писал(а):Разве так не работает?
Код: Выделить всё
pngImage.Assign(Bitmap);

О! Спасибо:)
Был не в курсе. Еще не пробовал.

Добавлено спустя 6 часов 19 минут 35 секунд:
Mikhail писал(а):
kotompazb писал(а):Щас еще хочу поковырять форматы png и gif, дабы реализовать возможность сохранения в них полученной картинки.

Разве так не работает?
Код: Выделить всё
pngImage.Assign(Bitmap);

А с гифом, я так понял, так не прокатит - read only - жаль.
Всем спасибо.

Оффтоп:
Я так понял на форуме принято править заголовок темы, добавляя "[Решено]"? Это просто, надо отредактировать заголовок первого поста темы, так?
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: Заполнение TBitMap из массива байт

Сообщение Лекс Айрин » 05.11.2015 10:29:57

kotompazb писал(а):Я так понял на форуме принято править заголовок темы, добавляя "[Решено]"?

Это принято не только на этом форуме.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: [Решено] Заполнение TBitMap из массива байт

Сообщение kotompazb » 05.11.2015 11:04:22

Ну ок. Вечером пройдусь по своим темам.
Аватара пользователя
kotompazb
постоялец
 
Сообщения: 151
Зарегистрирован: 21.06.2012 13:03:39
Откуда: Novosibirsk, xUSSR

Re: [Решено] Заполнение TBitMap из массива байт

Сообщение Tango » 05.11.2015 15:23:13

Вот рабочий пример.
Код: Выделить всё
Function DrawBMPButton(Const BMPType: String): TBitmap;
Const
  BMPPos=0;
Var
  Marker: Cardinal;
  MS, BS: TMemoryStream;
Begin
  MS:=TMemoryStream.Create;
  If CompareString(BMPType, 'find') Then
    MS.Write(FindBMP, Length(FindBMP));
  If CompareString(BMPType, 'FindCurrCell') Then
    MS.Write(FindCurrCellBMP, Length(FindCurrCellBMP));
  If CompareString(BMPType, 'ClearAllFind') Then
    MS.Write(FindCurrCellBMP_Neg, Length(FindCurrCellBMP_Neg));
  If CompareString(BMPType, 'print') Then
    MS.Write(PrintBMP, Length(PrintBMP));
  If CompareString(BMPType, 'structure') Then
    MS.Write(StructBMP, Length(StructBMP));
  If CompareString(BMPType, 'esc') Then
    MS.Write(Esc, Length(Esc));
  If CompareString(BMPType, 'bookmark') Then
    MS.Write(Bitmap_BookMark, Length(Bitmap_BookMark));
  If CompareString(BMPType, 'load') Then
    MS.Write(Bitmap_Load, Length(Bitmap_Load));
  If CompareString(BMPType, 'save') Then
    MS.Write(Bitmap_Save, Length(Bitmap_Save));
  If CompareString(BMPType, 'clear') Then
    MS.Write(Bitmap_Clear, Length(Bitmap_Clear));
  If CompareString(BMPType, 'cancel') Then
    MS.Write(Bitmap_X, Length(Bitmap_X));
  If CompareString(BMPType, 'FormDotActive') Then
    MS.Write(FormDotActive, Length(FormDotActive));
  If CompareString(BMPType, 'FormDotInactive') Then
    MS.Write(FormDotInactive, Length(FormDotInactive));

  If CompareString(BMPType, 'cut') Then
    MS.Write(Bitmap_Cut, Length(Bitmap_Cut));
  If CompareString(BMPType, 'copy') Then
    MS.Write(Bitmap_Copy, Length(Bitmap_Copy));
  If CompareString(BMPType, 'paste') Then
    MS.Write(Bitmap_Paste, Length(Bitmap_Paste));
  If CompareString(BMPType, 'undo') Then
    MS.Write(Bitmap_Undo, Length(Bitmap_Undo));

  If CompareString(BMPType, 'edit') Then
    MS.Write(Bitmap_Pen, Length(Bitmap_Pen));
  If CompareString(BMPType, 'new') or CompareString(BMPType, 'append') Then
    MS.Write(Bitmap_New, Length(Bitmap_New));

  If CompareString(BMPType, 'tools') Then
    MS.Write(Tools16, Length(Tools16));

  If CompareString(BMPType, 'Cancel') or CompareString(BMPType, 'CancelClose') Then
    MS.Write(Bitmap_Cancel, Length(Bitmap_Cancel));
  If CompareString(BMPType, 'Post') or CompareString(BMPType, 'PostClose') Then
    MS.Write(Bitmap_Post, Length(Bitmap_Post));

  If CompareString(BMPType, 'logo') Then
    MS.Write(DCLbmp, Length(DCLbmp));

  If CompareString(BMPType, 'logo_small') Then
    MS.Write(DCLbmp, Length(DCLbmp_Small));

  If MS.Size>0 Then
  Begin
    Marker:=0;
    MS.Position:=0;
    MS.Read(Marker, 3);

    If Marker=PAGSignature Then // PAG Signature
    Begin
      // Compressed BMP/
      BS:=TMemoryStream.Create;
      BS.Position:=0;
      DecompressProc(MS, BS);
      BS.Position:=0;
      MS.Position:=0;
      MS.CopyFrom(BS, BS.Size);
      FreeAndNil(BS);
    End;

    Result:=TBitmap.Create;
    MS.Position:=BMPPos;
    Result.LoadFromStream(MS);
    Result.TransparentColor:=Result.Canvas.Pixels[0, 0];
    Result.TransparentMode:=tmFixed; // tmAuto;
    Result.Transparent:=True;
  End
  Else
    Result:=TBitmap.Create;

  FreeAndNil(MS);
End;
Аватара пользователя
Tango
постоялец
 
Сообщения: 162
Зарегистрирован: 31.05.2012 17:07:30


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 257

Рейтинг@Mail.ru