Конференция "KOL" » Где можно посмотреть пример работы с KOLJPGImage? [Lazarus, WinCE]
 
  • Дмитрий Пырин (23.10.07 13:44) [0]
    Вопрос, наверное, к создателю- Дмитрию Матвееву.
    Дмитрий, не могли-бы вы выложить пример работы с KOLJPGImage ?
    я пробовал по аналогии с JpegObj, но налицо явное расхождение в методах.
  • mdw © (23.10.07 13:58) [1]
    Ну примерно так.
    ...
     {$IFDEF KOLCLASSES}{$I TMainForm.inc}{$ELSE} TMainForm = object(TObj) {$ENDIF}
    ...
     private
       procedure OnProgress (Sender: PObj);
     public
       JPEGImage: PJPEGImage;
     end;

    ....
    procedure TMainForm.KOLForm1FormCreate(Sender: PObj);
    begin
       JPEGImage:= NewJPEGImage; //Создаем
       JPEGImage.OnProgress:= OnProgress; //если нужно
    end;

    procedure TMainForm.KOLForm1Destroy(Sender: PObj);
    begin
       JPEGImage.Free; //разрушаем
    end;

    procedure TMainForm.Button1Click(Sender: PObj);
    begin
       try
         JPEGImage.LoadFromFile('C:\!.jpg'); //Загружаем картинку
         JPEGImage.Bitmap.Draw(Form.Canvas.Handle, 100, 100); //рисуем ее

         JPEGImage.Bitmap.LoadFromFile('!!.bmp'); //изменяем изображение
         JPEGImage.SaveToFile('!!!!!!!.jpg');  //Сохраняем jpeg
       except {on E: Exception do}
         ShowMessage('Error');     //Ошибка!!!!!!!!
       end;
    end;

    procedure TMainForm.OnProgress(Sender: PObj);
    begin
       ProgressBar.Progress:= JPEGImage.Progress;
       Applet.ProcessMessages;
    //    Sleep(20); //:)
    end;

    Еще можно поиграться опциями в JCONFIG.INC. Они соответственно могут влиять на размер еще, качество кодирования\декодирования, уровень обработки ошибок.
  • mdw © (23.10.07 14:00) [2]
    Кстати есть еще CxKOLTiffJpg. Он побыстрее будет. Я в основном ориентировался на Lazarus+WinCE.
  • Vladimir Kladov © (23.10.07 15:58) [3]
    И не только побыстрее. Я в него добавил возможность работать с jpeg'ами практически любого размера, не выделяя память для всей картинки. Можно получать или передавать строки пикселей для упаковки или наоборот для распаковки через событие. Сегодня проверил как раз, работает.
  • Дмитрий Пырин (27.10.07 21:19) [4]
    где взять CxKOLTiffJpg ?  в компонентах на http://kolnmck.ru его нет :(
  • Vladimir Kladov © (27.10.07 22:03) [5]
    kolmck.net
  • Сидор (13.02.08 17:03) [6]

    >   JPEGImage.Bitmap.Draw(Form.Canvas.Handle, 100, 100); //рисуем
    > ее

    Почему-то не помогает... Может быть, слово Form нужно заменить на что-то другое? (Но тогда на что? Form1 и KOLForm1 не проходят...)
    И ещё: что означают второй и третий параметры?
  • mdw © (13.02.08 22:10) [7]
    У меня работает, хотя конечно нужно в OnPain рисовать.

    > И ещё: что означают второй и третий параметры?

    Координаты X и Y, где рисовать.
  • mdw © (13.02.08 22:15) [8]
    Кстати, если кому нужно для КПК, я сделал чтение для BMP, GIF, JPG, PNG, XBM системными средствами, т.е. к коду практически ничего и не добавляется.
  • Сидор (14.02.08 11:50) [9]

    > У меня работает, хотя конечно нужно в OnPain рисовать.

    А вот об этом я не подумал...
    Тогда, получается, надо добавить код:
    JPEGImage.OnPaint:= OnPaint?
  • mdw © (14.02.08 15:53) [10]
    OnPaint того, на ком рисовать хотите. Например Form.OnPaint, хотя обычно PaintBox используют.
  • Сидор (15.02.08 15:09) [11]
    Гм... А помимо OnPaint ничего похожего поставить нельзя?
    Просто там ситуация такая: при запуске на форме должна быть картинка. Затем её можно будет убрать, сняв в главном меню галочку, и вернуть, поставив таковую обратно. Как реализовать, не знаю - на if MainMenu1.Items[x].Checked then ... не реагирует...
  • mdw © (15.02.08 17:27) [12]
    И в чем проблемма? Вот рабочий код:
    ....
     private
       FJPEGImage: PJPEGImage;
     public
    .....
    procedure TForm1.KOLForm1FormCreate(Sender: PObj);
    begin
       FJPEGImage:= NewJPEGImage;
       FJPEGImage.LoadFromFile('Disk.jpg');
    end;

    procedure TForm1.KOLForm1Paint(Sender: PControl; DC: HDC);
    begin
       if CheckBox1.Checked then FJPEGImage.Bitmap.Draw(DC, 0, 0);
    end;

    procedure TForm1.CheckBox1Click(Sender: PObj);
    begin
       Form.Invalidate;
    end;
  • Сидор (16.02.08 15:57) [13]
    В том-то и дело, что при первом запуске он эту галочку в главном меню не видит и ничего не рисует!
  • Сидор (16.02.08 16:02) [14]
    Удивительное рядом... Поставил чекбокс не в меню - картинка появилась...
  • Дмитрий Пырин (01.04.08 14:51) [15]
    Ничего не понимаю.
    при использовании  ImageDecompress компилятор выдаёт:

    D:\lazarus\kol\kol\ImageDecompress.pas(67,48) Fatal: Can't find unit TextOut used by ImageDecompress

  • mdw © (01.04.08 17:31) [16]

    > Ничего не понимаю.

    И что же тут непонятно? Убить нафиг модуль TextOut! :D
  • mdw © (01.04.08 17:37) [17]
    Кстати, для информации, по поводу ImageDecompress.
    При декодировании Jpeg, для некоторых картинок скорость может быть в несколько раз меньше (чуть ли не на порядок), чем у JpegImage, хотя обычно, примерно равны (небольшие отклонения в разные стороны).  
    При декодировании PNG, ImageDecompress обычно немного побыстрее. Остальные форматы не тестил, за ненадобностью.:)
  • Vinum (01.04.08 17:54) [18]
    Вчера пробовал ImageDecompress, textout убить догадался, но когда пишу

    uses ImageDecompress;
    .........
    Var Image:PImageDecompress;
    .........
    procedure TForm1.Button1Click(Sender: PObj);
    begin
    image:=NewImageDecompress;
    image.LoadFromFile('0933333.jpg'); // когда эту строчку пишу, то вываливается с ошибкой типа не могу запуститься потому что imgdecmp.dll не найдена, переустановка приложения (какого?) может исправит проблему. Покопал в интернете, толком не нашел. Какой выход есть из данной ситуации?
    XPSP2
  • Vinum (01.04.08 22:24) [19]
    сорри, торможу :)
  • Дмитрий Пырин (02.04.08 07:55) [20]
    При запуске под WinCE 5.0 (Aser n311)  при использовании  ImageDecompress
    программа выдаёт
    Runtime error 216
    странно
  • Дмитрий Пырин (02.04.08 08:27) [21]
    вот такой код :


    ...
     private
       Image:PImageDecompress;
    ...

    procedure TForm1.Button1Click(Sender: PObj);
    begin
     image.LoadFromFile('1.jpg');
     image:=NewImageDecompress;
    end;

    procedure TForm1.PaintBox1Paint(Sender: PControl; DC: HDC);
    begin
    Image.Bitmap.Draw(DC, 0, 0);
    end;  

  • Дмитрий Пырин (02.04.08 08:28) [22]
    пардон :)

    вот такой :


    ...
    private
      Image:PImageDecompress;
    ...

    procedure TForm1.Button1Click(Sender: PObj);
    begin
    image:=NewImageDecompress;
    image.LoadFromFile('1.jpg');
    end;

    procedure TForm1.PaintBox1Paint(Sender: PControl; DC: HDC);
    begin
    Image.Bitmap.Draw(DC, 0, 0);
    end;



    пробовал  вставить   image:=NewImageDecompress;   до показа основной формы, тоже не помогает
  • Дмитрий К © (02.04.08 08:37) [23]
    а если так:
    if Image <> nil then
     Image.Bitmap.Draw(DC, 0, 0);

  • Дмитрий Пырин (02.04.08 08:58) [24]
    хм.. удивительное рядом.
    удалил PaintBox с формы, и бросил заново. на рантайм ругаться перестало, но картинку не показывает.
    есть-ли какаято специфика работы с  LoadFromFile  в WinCE ?
  • D[u]fa (02.04.08 10:29) [25]
    может полный путь к картинке указать?
  • Дмитрий Пырин (02.04.08 10:44) [26]
    хм.. путь к файлу может меняться. никто ведь не знает, куда завтра мне взбредёт в голову положить программу и картинки. так что это не выход в любом случае, я думаю.
  • mdw © (02.04.08 12:00) [27]
    Попробовал, работает, скорее всего файл не находит, поэтому ничего не загружается, поэтому Bitmap = nil, поэтому и валится.

    procedure TForm1.KOLFormFormCreate(Sender: PObj);
    ......
       FImg:= NewImageDecompress;
       FImg.LoadFromFile(ExtractFilePath(ParamStr(0))+'getImage.jpg');
    ...

    procedure TTextOutForm.PaintBox1Paint(Sender: PControl; DC: HDC);
    begin
       if (FImg.Bitmap <> nil) and not FImg.Bitmap.Empty then FImg.Bitmap.Draw(DC, 0, 0);
    end;
  • Дмитрий Пырин (02.04.08 12:25) [28]
    мда.. как говорится, "толи лыжи не едут, толи я..."

    вот такой код:

    { KOL MCK } // Do not remove this line!
    {$DEFINE KOL_MCK}
    {$ifdef FPC} {$mode delphi} {$endif}
    unit Unit1;

    interface

    uses Windows, Messages, KOL {place your units here->},ImageDecompress
    {$IFDEF LAZIDE_MCK}, Forms, mirror, Classes, Controls, mckCtrls, mckObjs, Graphics;
    {$ELSE} ; {$ENDIF}

    type

     { TForm1 }

     {$I MCKfakeClasses.inc}
     {$IFDEF KOLCLASSES} TForm1 = class; PForm1 = TForm1; {$ELSE OBJECTS} PForm1 = ^TForm1; {$ENDIF CLASSES/OBJECTS}
     TForm1 = {$IFDEF KOLCLASSES}class{$ELSE}object{$ENDIF}({$IFDEF LAZIDE_MCK}TForm{$ELSE}TObj{$ENDIF})
       Button1: TKOLButton;
       ButtonForward: TKOLButton;
       ButtonBack: TKOLButton;
       Form: PControl;
       KOLForm1: TKOLForm;
       KOLProject1: TKOLProject;
       Memo1: TKOLMemo;
       PaintBox1: TKOLPaintBox;
       ProgressBar1: TKOLProgressBar;
       Image:PImageDecompress;
       procedure Button1Click(Sender: PObj);
       procedure PaintBox1Paint(Sender: PControl; DC: HDC);
     private
       { private declarations }
     public
       { public declarations }
     end;

    var
     Form1 {$IFDEF KOL_MCK} : PForm1 {$ELSE} : TForm1 {$ENDIF} ;

    {$IFDEF KOL_MCK}
    procedure NewForm1( var Result: PForm1; AParent: PControl );
    {$ENDIF}

    implementation

    {$IFDEF KOL_MCK}
    {$I unit1_1.inc}
    {$ENDIF}

    { TForm1 }

    procedure TForm1.Button1Click(Sender: PObj);
    begin
     image:=NewImageDecompress;
     image.LoadFromFile(ExtractFilePath(ParamStr(0))+'1.jpg');
    end;

    procedure TForm1.PaintBox1Paint(Sender: PControl; DC: HDC);
    begin
     if (image.Bitmap <> nil) and not image.Bitmap.Empty then image.Bitmap.Draw(DC, 20, 20);
    end;

    initialization

    end.  



    не работает :(
    не вылетает, но и не работает..
  • Дмитрий Пырин (02.04.08 12:59) [29]
    продолжаю танцы с бубном.. плюнул на визуальную разработку и написал вот так :

    program project1;
    {$mode objfpc}{$H+}
    uses
    KOL,Windows,Messages,ImageDecompress;

    var
    Form,
    pTop,
    PB,
    buOpen,
    SBox:pControl;
    JPG:PImageDecompress;

    procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
    begin
    if (JPG^.Bitmap <> nil) and not JPG^.Bitmap^.Empty then JPG^.Bitmap^.Draw(DC, 20, 20);

    end;
    ///////////////////////////////////////////////////////////
    Procedure OpenPic ;//( Dummy : Pointer; Sender : PControl );
    begin
    jpg:=NewImageDecompress;
    jpg^.LoadFromFile(ExtractFilePath(ParamStr(0))+'1.jpg');
    PB^.Width :=  JPG^.Bitmap^.Width ;
    PB^.Height:=  JPG^.Bitmap^.Height;

    end;

    begin

    Applet := NewApplet('Pixie');
    Form := NewForm(Applet,'Pixie');

    // -------- интерфейс -----------------------------
    pTop := NewPanel(Form,esRaised)^. SetAlign(caTop);
    pTop^.Height := 35;

    buOpen := NewButton(pTop,'show')^.SetAlign(caLeft);
    buOpen^.OnClick := TOnEvent( MakeMethod( nil, @OpenPic ) );
    SBox := NewScrollBoxEx(Form,esLowered)^.SetAlign(caClient);
    PB := NewPaintBox(SBox);
    PB^.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) );
    PB^.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) );
    // -------------------------------------------------------

    run(Applet);

    end.                



    снова полезло "Runtime error 216"
    причём что на КПК, что в эмуляторе проблема одинаковая.

    WinCE 5.0  и там и там
  • Дмитрий Пырин (02.04.08 13:03) [30]
    гы.. пардон, ничаяно 2 раза вставил

    PB^.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) );



    у меня в исходнике одна.. но сути это не меняет.. как не работало, так и не работает :(
  • Дмитрий Пырин (02.04.08 13:08) [31]
    если не трудно, попробуйте пожалуйста скомпилировать у себя , возможно у меня с компилятором проблемы ?

    я работаю на:

    Lazarus-0.9.23-fpc-2.2.0-20071019-win32
    fpc-2.2.0.arm-wince
    kolce_rev247
  • Дмитрий Пырин (02.04.08 13:16) [32]
    ошибка рантайма вылетает сразу при запуске.
    проблема явно в этой процедуре:

    procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
    begin
    if (JPG^.Bitmap <> nil) and not JPG^.Bitmap^.Empty then JPG^.Bitmap^.Draw(DC, 20, 20);
    end;



    если её содержимое закомментировать , то вылета ошибки рантайма нет.
  • Дмитрий К © (02.04.08 13:22) [33]

    > ошибка рантайма вылетает сразу при запуске.

    правильно. jpg-то не создан.
  • Дмитрий Пырин (02.04.08 13:34) [34]
    урааааа.. !!!!!!!!
    заработало.. всем спасибо :)


    program project1;
    uses
    KOL,Windows,Messages,ImageDecompress;

    var
    Form,
    pTop,
    PB,
    buOpen,
    SBox:pControl;
    JPG:PImageDecompress;

    procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
    begin
    if (JPG^.Bitmap <> nil) and not JPG^.Bitmap^.Empty then JPG^.Bitmap^.Draw(DC, 0, 0);
    end;

    Procedure OpenPic ;//( Dummy : Pointer; Sender : PControl );
    begin
    jpg^.LoadFromFile(ExtractFilePath(ParamStr(0))+'f.jpg');
    PB^.Width :=  JPG^.Bitmap^.Width ;
    PB^.Height:=  JPG^.Bitmap^.Height;
    end;
    //=======================================
    begin
    Applet := NewApplet('Pixie');
    Form := NewForm(Applet,'Pixie');
    jpg:=NewImageDecompress;
    // --------интерфейс -----------------------------
    pTop := NewPanel(Form,esRaised)^. SetAlign(caTop);
    pTop^.Height := 35;

    buOpen := NewButton(pTop,'show')^.SetAlign(caLeft);
    buOpen^.OnClick := TOnEvent( MakeMethod( nil, @OpenPic ) );
    SBox := NewScrollBoxEx(Form,esLowered)^.SetAlign(caClient);
    PB := NewPaintBox(SBox);
    PB^.OnPaint := TOnPaint( MakeMethod( nil, @DrawPaint ) );
    // -------------------------------------------------------

    run(Applet);

    end.  



    ЗЫ:
    больше я в МСК ни ногой :(  только PURE KOL .. как в тьюторе по МАСМ-у написано "PURE and SIMPLE" :)
  • D[u]fa (02.04.08 14:17) [35]
    buOpen^.OnClick := TOnEvent( MakeMethod( nil, @OpenPic ) );

    Procedure OpenPic ;//( Dummy : Pointer; Sender : PControl );

    по-моему явная ошибка
  • GMax (02.04.08 22:55) [36]
    проще всего

    procedure DrawPaint( Dummy: Pointer; Sender: PControl; DC: HDC );
    begin
    if (JPG<>nil) and (JPG^.Bitmap <> nil) and not JPG^.Bitmap^.Empty then JPG^.Bitmap^.Draw(DC, 20, 20);
    end;

    и не жаловаться на Mirror, коли руки кривы :)
  • Дмитрий Пырин (03.04.08 07:15) [37]
    Я не жалуюсь на миррор, просто всю жизнь писал исключительно на ассемблере, и не привык к требованиям обьявления и инициализации переменных в ЯВУ. Поэтому и чистый КОL мне роднее и понятней :)
  • имя (29.05.08 23:36) [38]
    Удалено модератором
  • имя (30.05.08 03:12) [39]
    Удалено модератором
 
Конференция "KOL" » Где можно посмотреть пример работы с KOLJPGImage? [Lazarus, WinCE]
Есть новые Нет новых   [134431   +15][b:0][p:0.006]