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

Вниз

Чтение/запись в BLOB-поле IB файла JPEG.   Найти похожие ветки 

 
Петр   (2004-06-02 08:45) [0]

Не могу считать из BLOB-поля IB в TImage записанный файл формата JPEG. Пробовал и TImage.Picture.Assign(<BLOB-поле>), и через поток TMemoryStream, используя SaveToStream и LoadFromStream, все равно выдает ошибку  вроде "JPEG error #41", хотя с записью проблем нет. Сделал через временный файл посредством SaveToFile,LoadFromFile,
но это, согласитесь, не выход из положения. Подкиньте, пожалуйста, идейку. Буду благодарен.


 
Johnmen ©   (2004-06-02 09:06) [1]

Код пробования чтения ?


 
sniknik ©   (2004-06-02 09:07) [2]

читать надо также как и пишеш - пишеш в базу с файла (неважно LoadFromFile или LoadFromStream если в стриме файл) значит и вынимать из базы нужно в файл, если с картинки то в картинку.
это основная идея.
почему это важно? думаю потому что в файле и в картинке на экране(компоненте) разное представление в файле лежит сжатый образ плюс там может быть палитра и д.р. гадость (если не путаю, про форматы давно читал еще во времена глобального доса), это не BMP который практически образ памяти. в общемто былобы неважным если бы метод TImage.Picture.Assign "умел" распознавать что ему пришло на вход в каком виде и преобразовывать если данные как из файла. "научите" его, или сам следи что где.


 
sniknik ©   (2004-06-02 09:11) [3]

Johnmen ©   (02.06.04 09:06) [1]
ну ты захотел, прям сразу. ;о))
сначала в общем поорасуждаем, может быть на глюки борланда посетуем, ...(хз.), а вот после если дойдет необходимось... ;о))


 
Johnmen ©   (2004-06-02 09:14) [4]

>sniknik ©   (02.06.04 09:11) [3]

:)


 
1008 ©   (2004-06-02 12:18) [5]

Для чтения:
var
MyStream:TStream;

...

MyStream:=YouTable.CreateBlobStream(FieldByName("Picture"), bmRead);
...
{манипулируем потоком}
...
MyStream.Free;//лучше освободить ресурсы

Для записи:
var
MyStream:TMemoryStream;

...

MyStream:=TMemoryStream.Create;

with Data.Query do begin
 Active:=false;
 SQL.Clear;
 SQL.Add("INSERT INTO YouTable (Pictures)");
 SQL.Add("VALUES (:Pictures)");
 Params[0].LoadFromStream(MyStream, ftBlob);
 Open;
end;//with Data.Query do begin

MyStream.Free;//лучше освободить ресурсы

Если не ошибаюсь, то так.


 
Romkin ©   (2004-06-02 13:05) [6]

Вот, разгребается с типом изображения:


function GetStreamImgType(Stream: TStream): TClass;
var
 StreamPos: int64;
 ImgSign: string;
begin
 StreamPos := Stream.Position;
 try
   //BMP если не определено
   Result := Graphics.TBitmap;
   //JPEG
   SetLength(ImgSign, 4);
   Stream.Seek(6, soFromCurrent);
   Stream.Read(ImgSign[1],4);
   if (UpperCase(ImgSign) = "JFIF") or (UpperCase(ImgSign) = "EXIF") then
     Result := Jpeg.TJPEGImage;
   //WMF
   Stream.Position := StreamPos;
   SetLength(ImgSign, 4);
   Stream.Read(ImgSign[1],4);
   if ImgSign = #$D7#$CD#$C6#$9A then
     Result := Graphics.TMetafile;
 finally
   Stream.Position := StreamPos;
 end;
end;

procedure LoadProperImage(Stream: TStream; Picture: TPicture);
var
 Img: TGraphic;
 StreamPos: int64;
begin
 StreamPos := Stream.Position;
 Img := TGraphicClass(GetStreamImgType(Stream)).Create;
 try
   Stream.Position := StreamPos;
   Img.LoadFromStream(Stream);
   Picture.Graphic := Img;
 finally
   Img.Free;
 end;
end;

function LoadPictureFromBLOB(Picture: TPicture; Field: TBlobField): boolean;
var
 Stream: TStream;
begin
 Result := False;
 if not Field.isNULL then
 begin
   Stream := TMemoryStream.Create;
   try
     Field.SaveToStream(Stream);
     Stream.Position := 0;
     LoadProperImage(Stream, Picture);
     Result := True;
   finally
     Stream.Free;
   end;
 end;
end;

procedure SavePictureToBlob(Picture: TPicture; Field: TBlobField);
var
 Stream: TStream;
begin
 if not (Field.DataSet.State in [dsEdit, dsInsert]) then
   Field.DataSet.Edit;
 Field.Clear;
 if Assigned(Picture.Graphic) then
   if not Picture.Graphic.Empty then
     begin
       Stream := TMemoryStream.Create;
       try
         Picture.Graphic.SaveToStream(Stream);
         Stream.Position := 0;
         Field.LoadFromStream(Stream);
       finally
         Stream.Free;
       end;
     end;
end;


 
TATIANA   (2004-06-03 11:56) [7]

Пример далек от совершенства , надо обрабатывать исключительные ситуации . В начале модуля необходимо вставить <JPEG>
.....
interface

uses Windows, Graphics, Forms, ...  , Jpeg;

.....
var Bm1:TMemoryStream;
   Jp1:TBitmap;
   Jp2:TJPEGImage;
   notJpg:Boolean;
begin
 notJpg := false;

 Image1.Picture.Assign(nil);
 notJpg := False;
 Bm1:= TMemoryStream.Create;
 IBQuery5PLAN_KV.SaveToStream(Bm1);
 Bm1.Position := 0;
 if Bm1.Size > 0 then begin
 try
   Jp1 := TBitmap.Create;
   Jp1.LoadFromStream(Bm1);
   Image1.Picture.Bitmap.Assign(Jp1);  //  .bmp
 Except
    on EInvalidGraphic do notJpg := true;
 end;
 Jp1.Free;
 Bm1.Free;
 if notJpg then begin
    Bm1:= TMemoryStream.Create;
    IBQuery5PLAN_KV.SaveToStream(Bm1);
    Bm1.Position := 0;
    Jp2 := TJPEGImage.Create;
    Jp2.LoadFromStream(Bm1);
   try
    Image1.Picture.Bitmap.Assign(Jp2);   //  .ipg
   finally
    Bm1.Free;
    Jp2.Free;
   end;
 end;
 end
 else
   begin
   Image1.Picture.Assign(nil);
   Bm1.Free;
 end;   //  bm1.size > 0
// ris - dom
  end;  //  ibq5
//   ris
 notJpg := False;
 Bm1:= TMemoryStream.Create;
 case WPR of
 0: Form3.IBQuery1PLAN_KV.SaveToStream(Bm1);
 1: Form5.IBQuery1PLAN_KV.SaveToStream(Bm1);
 end;
 Bm1.Position := 0;
 if Bm1.Size > 0 then begin
 try
   Jp1 := TBitmap.Create;
   Jp1.LoadFromStream(Bm1);
   Image2.Picture.Bitmap.Assign(Jp1);
 Except
    on EInvalidGraphic do notJpg := true;
 end;
 Jp1.Free;
 Bm1.Free;
 if notJpg then begin
    Bm1:= TMemoryStream.Create;
    case WPR of
    0: Form3.IBQuery1PLAN_KV.SaveToStream(Bm1);
    1: Form5.IBQuery1PLAN_KV.SaveToStream(Bm1);
    end;
    Bm1.Position := 0;
    Jp2 := TJPEGImage.Create;
    Jp2.LoadFromStream(Bm1);
   try
    Image2.Picture.Bitmap.Assign(Jp2);
   finally
    Bm1.Free;
    Jp2.Free;
   end;
 end;
 end
 else
   begin
   Image2.Picture.Assign(nil);
   Bm1.Free;
 end;   //  bm1.size > 0
 IBTransaction1.Active := false;
 //   ris
 end;   //  izmg > 1


 
Aladin ©   (2004-06-03 12:53) [8]

Попробуйте компонент
umDBImage



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

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

Наверх




Память: 0.49 MB
Время: 0.021 c
3-1085857779
DIS
2004-05-29 23:09
2004.06.27
в запросе условие WHERE


14-1086522662
Артем К.
2004-06-06 15:51
2004.06.27
Компоненты различных измерительных уст-тв


3-1085985441
User_OKA
2004-05-31 10:37
2004.06.27
ACCESS TADOConnection


1-1087300190
denis_group
2004-06-15 15:49
2004.06.27
Нужен мощный Grid.


3-1085963746
vasves
2004-05-31 04:35
2004.06.27
Удалены индексные файлы