Форум: "Базы";
Текущий архив: 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.48 MB
Время: 0.044 c