Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

Как работать граф.файл pcx формата?   Найти похожие ветки 

 
Денис   (2005-10-12 22:48) [0]

TJPEGImage.create,TBitmap.create - с этим все понятно но как с PCX подскажите пожалуйста?


 
ЮЮ ©   (2005-10-13 05:51) [1]

Искать TPCXImage, естественно :)


 
Defunct ©   (2005-10-13 12:48) [2]

За 10 минут написанная функция. Можете ее оптимизировать:

procedure LoadPCX( FileName : String;  DestBitmap : TBitmap );
type
  TPCXPalette = Array[0..255] of TColor;
var
  PCXPalette : TPCXPalette;
  Stream : TFileStream;
  i, j : integer;
  R, G, B: byte;
  PCXWidth, PCXHeight : Word;
  Color : TColor;
  SectionLength : Integer;

begin
  with TFileStream.Create( FileName, fmOpenRead ) do
  try
     Position := 8;
     Read( PCXWidth, 2);
     Read( PCXHeight, 2);

     Position := Size - 768; // Seek to PCX palette location

     { Loading PCX palette }
     for i := 0 to 255 do
     begin
        Read( R, 1);
        Read( G, 1);
        Read( B, 1);
        PCXPalette[i] := RGB(R, G, B);
     end;

     Position := 128;  // Seek to PCX data
     DestBitmap.Width := PCXWidth;
     DestBitmap.Height := PCXHeight;
     DestBitmap.PixelFormat := pf24bit;

     { Loading PCX image }
     SectionLength := 0;
     for j := 0 to PCXHeight do
       for i := 0 to PCXWidth do
       begin
          if SectionLength = 0 then
             begin
                Read(B, 1);
                if B < 192 then
                   begin
                      Color := PCXPalette[ B ];
                      DestBitmap.Canvas.Pixels[i, j] := Color
                   end
                else
                   begin
                      SectionLength := B - 192;
                      Dec( SectionLength );
                      Read(B, 1);
                      Color := PCXPalette[ B ];
                      DestBitmap.Canvas.Pixels[i, j] := Color
                   end;
             end
          else
             begin
                Dec( SectionLength );
                DestBitmap.Canvas.Pixels[i, j] := Color
             end
       end

  finally
     free
  end;
end;


Пример применения:

procedure TForm1.Button1Click(Sender: TObject);
var
  Bmp : TBitmap;
begin
  if OpenDialog1.Execute then
  begin
     Bmp := TBitmap.Create;
     try
        LoadPCX( OpenDialog1.FileName, Bmp );
        Canvas.Draw(0,0, Bmp);
     finally
        Bmp.Free;
     end;
  end;
end;


 
Amoeba ©   (2005-10-13 12:55) [3]

Или использвать библиотеку GraphicEx
http://www.delphi-gems.com/Graphics.php


 
Денис   (2005-10-13 14:02) [4]

Спасибочки большое!


 
Денис   (2005-10-13 22:20) [5]

ваша программа без изьяна,но извиняюсь за нахальство, а как теперь pcx вытянуть из моего *.res файла?
С bmp-я делаю так
MPicB[d]:=TBitMap.Create;ResStream:=TResourceStream.CreateFromID(HInstance,c,RT_RCDATA);
MPicB[d].LoadFromStream(ResStream);
а как с pcx?


 
Zeqfreed ©   (2005-10-13 23:14) [6]

Денис   (13.10.05 22:20) [5]
Пускай это будет твоим домашним заданием.
Подсказка: следует почитать раздел справки о TFileStream и связанные с ним (See Also) разделы; а так же, поглядеть получше на представленный код.


 
Defunct ©   (2005-10-14 15:48) [7]

Денис   (13.10.05 22:20) [5]

сделайте тогда так:

procedure LoadPCXfromStream( Stream: TStream; DestBmp : TBitmap);

в var секции уберите Stream : TFileStream (он там и изначально был не нужен).

и поменяйте код так:
вместо
with TFileStream.Create( ... ) do
try
..
finally
 free
end

напишите:

with Stream do
begin
 ...
end;


 
Денис   (2005-10-16 00:30) [8]

Уважаемый Zeqfreed я посмотрел help в раздел справки о TFileStream и связанные с ним (See Also) разделы и ни че не понял, я только начинающий и с классоми еще не работал...
Defunct - спасибо за код, но не могли бы представить это, как в первый раз в работающем примере у меня ни чего не выходит "я только начинающий "
исправил как вы сказали, но ничего не выходит:
begin
with Stream do
 begin

    Position := 8;
    Read( PCXWidth, 2);
    Read( PCXHeight, 2);

    Position := Size - 768; // Seek to PCX palette location

    { Loading PCX palette }
    for i := 0 to 255 do
    begin
       Read( R, 1);
       Read( G, 1);
       Read( B, 1);
       PCXPalette[i] := RGB(R, G, B);
    end;

    Position := 128;  // Seek to PCX data
    DestBitmap.Width := PCXWidth;
    DestBitmap.Height := PCXHeight;
    DestBitmap.PixelFormat := pf24bit;

    { Loading PCX image }
    SectionLength := 0;
    for j := 0 to PCXHeight do
      for i := 0 to PCXWidth do
      begin
         if SectionLength = 0 then
            begin
               Read(B, 1);
               if B < 192 then
                  begin
                     Color := PCXPalette[ B ];
                     DestBitmap.Canvas.Pixels[i, j] := Color
                  end
               else
                  begin
                     SectionLength := B - 192;
                     Dec( SectionLength );
                     Read(B, 1);
                     Color := PCXPalette[ B ];
                     DestBitmap.Canvas.Pixels[i, j] := Color
                  end;
            end
         else
            begin
               Dec( SectionLength );
               DestBitmap.Canvas.Pixels[i, j] := Color
            end
      end
 end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
 Bmp : TBitmap;
 ResStream:TResourceStream;
 St: TStream;
begin
    Bmp := TBitmap.Create;
    try
  //   St:=TStream.CreateFromID(HInstance,1,RT_RCDATA);
       LoadPCXfromStream( St, Bmp );
       Canvas.Draw(0,0, Bmp);
    finally
       Bmp.Free;
    end;
end;


 
Денис   (2005-10-16 00:40) [9]

пишу свою игрушку "маджонг", она работает, хотелось бы чтоб она занимала мин.обьем, пользуюсь выводом графики ч.з.:
BitBlt..SrcAnd);
BitBlt..SRCPaint);
формат BMP-большой,а при переходе на jpg глюки из за того что jpg на белом фоне не похож на jpg на черном фоне, единственное pcx формат помог он и весит меньше и соответствует по-pixel-но, может что подскажете по поводу....



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.036 c
1-1129290248
Lirik
2005-10-14 15:44
2005.11.06
Запретить двигать формой


14-1129120340
MacroDenS
2005-10-12 16:32
2005.11.06
Стабилизированные 12 вольт


4-1125777895
SamProf
2005-09-04 00:04
2005.11.06
Управлять активным Editom не на своей форме!


1-1129293783
sax_ol
2005-10-14 16:43
2005.11.06
Как определить имя контрола имея его Handle?


1-1129528210
Карелин Артем
2005-10-17 09:50
2005.11.06
Как сохранить/считать свойства потомка TObject в строку?