Lazarus и PCX-файлы

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

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

Ответить
Smoky555
незнакомец
Сообщения: 6
Зарегистрирован: 05.03.2007 14:35:33
Откуда: Volgograd
Контактная информация:

Lazarus и PCX-файлы

Сообщение Smoky555 »

Народ, подскажите, чем можно соединить перечисленное?

Задача такая - есть PCX файлы, содержащие спрайты, если файлы с описанием этих спрайтов (координаты начала, размеры). Мне надо выдергивать по-спрайтно, кусками ...

Мож я что-то не так понимаю, уж вы объясните, мастера, я - новичок в программировании в общем и в Лазарусе - в частности ...

Надеюсь на развернутый ответ :)

P.S. не обижусь, если ткнёте в онлайновый ресурс с описанием моего случая (ну или хотя бы примерно).

Удачи всем ;)
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Никогда не сталкивался с PCX, так, что первое, что приходить на ум - конвертирование в какой-либо другой формат (jpg, png, bmp)...
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

ну если есть слова (координаты начала, размеры)
то могу предложить то тебе нужен TFileStream
почитать тут

PS там где написанно для delphi также должно работать и для лазаря
это так если совсем новичек =)
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Attid писал(а):ну если есть слова (координаты начала, размеры)
то могу предложить то тебе нужен TFileStream

Можно конечно и так, но, imho, это анахронизм.
В случае с bmp за который отвечает TBitmap проще сделать так

Код: Выделить всё

var
  bmp: TBitmap;
  sprite: TBitmap;
  sprite_rect: TRect;
  rect: TRect;
begin
  bmp := TBitmap.Create;
  bmp.LoadFromFile('ImageSet.bmp');
  sprite := TBitmap.Create;
  rect.Left := 0;
  rect.Top := 0;
  rect.Right := sprite_rect.Right - sprite_rect.Left;
  rect.Bottom := sprite_rect.Bottom - sprite_rect.Top;
  sprite.width := rect.Right;
  sprite.height := rect.Bottom;
  sprite.canvas.CopyRect(rect, bmp.Canvas, sprite_rect);
  bmp.Free; // Если исходная картинка более не нужна
end;

И никакого шаманства на уровне TFileStream...

В случае другий форматов (jpg, png) нужно сначала получить bmp,.. хотя бы через те же bmp.canvas.draw или bmp.canvas.CopyRect
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

А если у вас много спрайтов одинаковых размеров, то см. также TImageList
ev
долгожитель
Сообщения: 1792
Зарегистрирован: 27.04.2005 23:19:06
Откуда: Москва

Сообщение ev »

был удивлен, что IE уже не читает PCX
может стоит задуматься о смене формата? ;)
Smoky555
незнакомец
Сообщения: 6
Зарегистрирован: 05.03.2007 14:35:33
Откуда: Volgograd
Контактная информация:

Сообщение Smoky555 »

Ладно, с этим я разобрался, все считывается, все определяется, НО
возник второй вопрос - на форме есть компонент TImage, как в него вставить рисунок, по-байтно сохраненный в двумерном массиве?
Мне подсказали вот такую последовательость :

Код: Выделить всё

SetBitmapBits(Image1.Picture.Bitmap.Handle, sizeof(TestArray), @TestArray); 
Image1.Refresh; {для того, чтобы изменения отобразились}


Однако-ж Lazarus говорит что "Нет такой функции ...
Аватара пользователя
shade
энтузиаст
Сообщения: 879
Зарегистрирован: 21.02.2006 19:15:48
Откуда: http://shamangrad.net/
Контактная информация:

Сообщение shade »

Это функция WinAPI и определена в модуле windows, соответственно работать будет только под Windows, да и не все так просто, нужно еще про формат пикселей помнить (от него зависит в каком формате нужно подставить TestArray)
Ответить