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

Вниз

Подружить TDBImage и jpeg. Как лучше всего?   Найти похожие ветки 

 
DVM ©   (2007-05-31 11:15) [0]

Пока ничего не приходит в голову как заменить TDBImage на обычный TImage и грузить данные из BLOB поля в него.

Есть еще варианты?


 
clickmaker ©   (2007-05-31 11:27) [1]

как вариант, написать наследника, переопределить CreateHandle и грузить через TJpegImage


 
PEAKTOP(banned)   (2007-05-31 12:39) [2]

Идем в модуль DBCtrls.pas, копируем класс TDBImage (декларацию и методы и implementation) и всталяем в новый модуль, обзывая как-нибудь по другому, например TxcDBImage. Далее переопределяем методы

.......
implementation
uses
 ........,   Jpeg,  PngImage1, .......;
..............
procedure TxcDBImage.LoadPicture;
var
 Jpeg    :TJpegImage;
 Png     :TPngImage;
 Strm    :TMemoryStream;
 Buff    :array[0..9]of Byte;
begin
 if((not FPictureLoaded)and(Assigned(FDataLink.Field)))then
   if(FDataLink.Field.IsBlob)then
     begin
     Strm := TMemoryStream.Create;
     TBlobField(FDataLink.Field).SaveToStream(Strm);
     Strm.Seek(0, soFromBeginning);
     Strm.Read(Buff, SizeOf(Buff));
     Strm.Seek(0, soFromBeginning);
     if((Buff[0]=$FF)and(Buff[1]=$D8)and(Buff[2]=$FF)and(Buff[3]=$E0)and(Buff[4]=$00) and
        (Buff[5]=$10)and(Buff[6]=$4A)and(Buff[7]=$46)and(Buff[8]=$49)and(Buff[9]=$46))th en
       begin
       Jpeg   := TJpegImage.Create;
       Jpeg.LoadFromStream(Strm);
       Jpeg.DIBNeeded;
       FPicture.Bitmap.Assign(Jpeg);
       Jpeg.Free;
       end
      else
       begin
       if((Buff[0]=$89)and(Buff[1]=$50)and(Buff[2]=$4E)and(Buff[3]=$47)and(Buff[4]=$0D) and
          (Buff[5]=$0A)and(Buff[6]=$1A)and(Buff[7]=$0A)and(Buff[8]=$00)and(Buff[9]=$00))th en
         begin
         Png   := TPngImage.Create;
         Png.LoadFromStream(Strm);
         FPicture.Bitmap.Assign(Png);
         Png.Free;
         end
        else
         FPicture.Assign(FDataLink.Field);
       end;
     Strm.Free;
     if(Assigned(FAfterPictureLoaded))then
       FAfterPictureLoaded(Self);
     end;
end;

procedure TxcDBImage.Paint;
var
 Size: TSize;
 R: TRect;
 S: string;
 DrawPict: TPicture;
 Form: TCustomForm;
 Pal: HPalette;
 Jpeg    :TJpegImage;
 Png     :TPngImage;
 Strm    :TMemoryStream;
 Buff     :array[0..9]of Byte;
begin
 with Canvas do
 begin
   Brush.Style := bsSolid;
   Brush.Color := Color;
   if FPictureLoaded or (csPaintCopy in ControlState) then
     begin
     DrawPict := TPicture.Create;
     Pal := 0;
     try
       if (csPaintCopy in ControlState) and Assigned(FDataLink.Field) and FDataLink.Field.IsBlob then
         begin

         Strm := TMemoryStream.Create;
         TBlobField(FDataLink.Field).SaveToStream(Strm);
         Strm.Seek(0, soFromBeginning);
         Strm.Read(Buff, SizeOf(Buff));
         Strm.Seek(0, soFromBeginning);
         if((Buff[0]=$FF)and(Buff[1]=$D8)and(Buff[2]=$FF)and(Buff[3]=$E0)and(Buff[4]=$00) and
            (Buff[5]=$10)and(Buff[6]=$4A)and(Buff[7]=$46)and(Buff[8]=$49)and(Buff[9]=$46))th en
           begin
           Jpeg   := TJpegImage.Create;
           Jpeg.LoadFromStream(Strm);
           Jpeg.DIBNeeded;
           DrawPict.Bitmap.Assign(Jpeg);
           Jpeg.Free;
           end
          else
           begin
          if((Buff[0]=$89)and(Buff[1]=$50)and(Buff[2]=$4E)and(Buff[3]=$47)and(Buff[4]=$0D) and
              (Buff[5]=$0A)and(Buff[6]=$1A)and(Buff[7]=$0A)and(Buff[8]=$00)and(Buff[9]=$00))th en
             begin
             Png   := TPngImage.Create;
             Png.LoadFromStream(Strm);
             DrawPict.Bitmap.Assign(Png);
             Png.Free;
             end
            else
             DrawPict.Assign(FDataLink.Field);
           end;
         Strm.Free;

         if DrawPict.Graphic is TBitmap then
           DrawPict.Bitmap.IgnorePalette := QuickDraw;
         end
.............

end

После этого TxcDBImage поддерживает PNG, JPEG. Можно еще GIF до кучи привязать. Мне просто было лень.

З.Ы. Библиотека JPEG - стандартная от Бормана, библиотеку PNG взял от компонента THTMLViewer, если нет, можно просто убить эту часть из исходника.


 
DVM ©   (2007-05-31 13:26) [3]


> PEAKTOP(banned)  

Спасибо, я пока по-простому решил через обычный TImage. Но все равно пригодится.


 
sniknik ©   (2007-05-31 14:10) [4]

> Но все равно пригодится.
легко, даже если не хочется делать свой компонент, инсталировать в дельфи (ну или может нельзя как у нас), пользуясь "типа стандартным" TDBImage... (на форме его размещать)
делаешь объявления до формы,

type
 TxcDBImage = class(TDBImage)  //это как дополнение к коду в [2]
   procedure LoadPicture;
   procedure Paint;
 end;

 TDBImage = class(TxcDBImage);  //фокус

 TForm1 = class(TFopm)
   DBImage1: TDBImage;  //положенный на форму "стандартный" вернее уже нестандартный компонент
   ...

все, теперь "стандартный" будет понимать jpeg.

кстати в аксесс ты можеш встретится не только с просто картинкой, а с обьектом у которого есть префикс указывающий чем эту картинку открывать...
можеш сделать такую, открыть таблицу в аксессе так чтобы аксесс занимал пол экрана. во второй половине окно проводника, найди в проводнике любую картинку/документ и перетаскивай в поле таблицы (должно быть типа обьект OLE, т.е. того же в какой рисунки сохраняешь),  посмотри что будет.


 
PEAKTOP(banned)   (2007-05-31 14:49) [5]

> TDBImage = class(TxcDBImage);  //фокус

Ага, а потом ловим ошибки периода компиляции по всему юниту и зависимым юнитам о несовместимости классов TDBImage и TDBImage. А по законам Мерфи это произойдет ровно через полгода, когда проект разрастется, отработает и закроется, и все участники забудут, где-что-прикручено. :)


 
Виталий Панасенко ©   (2007-05-31 15:12) [6]

А чем "халява" не угодила ? я о JEDI компонентах


 
DVM ©   (2007-05-31 16:33) [7]


> я о JEDI компонентах

Я изо всех сил стараюсь не использовать сторонние компоненты. Даже свои стараюсь не применять. А джеди вообще монстр из монстров.


 
DVM ©   (2007-05-31 16:36) [8]


> кстати в аксесс ты можеш встретится не только с просто картинкой,
>  а с обьектом у которого есть префикс указывающий чем эту
> картинку открывать

Не я не встречусь. Я в базу картинки сам и кладу программой на делфи.
Напрямую в акцесс базу открывать никто не будет.



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

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

Наверх




Память: 0.5 MB
Время: 0.027 c
15-1187942734
Vitaliy_____
2007-08-24 12:05
2007.10.07
Принадлежность точки контуру


15-1189006440
Denis_
2007-09-05 19:34
2007.10.07
Не получается решить уравнение:(


2-1189575199
zero
2007-09-12 09:33
2007.10.07
Помогите решить задачку на турбо паскале


2-1189170412
Arm79
2007-09-07 17:06
2007.10.07
ScreenToClient - отрицательные отрицательные значения Point.Y


15-1189131844
Slider007
2007-09-07 06:24
2007.10.07
С днем рождения ! 7 сентября 2007 пятница