Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];

Вниз

Чтение/запись в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.47 MB
Время: 0.041 c
1-1086864345
Alex_2004
2004-06-10 14:45
2004.06.27
FastReport


3-1086152913
korvin
2004-06-02 09:08
2004.06.27
Заказ имени поля в результате запроса


1-1087291485
Moon
2004-06-15 13:24
2004.06.27
Перерасход памяти


3-1085923975
lameridze
2004-05-30 17:32
2004.06.27
Непонятки с МайЭсКюЭль


14-1086585719
Slavian
2004-06-07 09:21
2004.06.27
Мышь (Com2) и WindowsXP!





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский