Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
ВнизTDBImage Найти похожие ветки
← →
ec (2003-05-29 18:57) [0]Я создал в Accesse MDB, подключил её к делфи через ODBC, TEXT, MEMO читается, а картинки открыть не могу, вылетает ошибка "Bitmap image is not valid". Что я не так сделал ?
← →
Johnmen (2003-05-29 22:51) [1]А что ты сделал ?
← →
sniknik (2003-05-30 01:28) [2]> Что я не так сделал ?
открыл не так. :-)
картинки в Accesse имеют свой префикс (если самим аксессом ложить) TDBImage читать не будет. только если самому ложить и самому читать, или разбирать префикс и преобразовывать как это Access делает. Если на то пошло это и не имадж а поле Ole обьекта, в которое пихают все подряд.
← →
ec (2003-05-30 17:37) [3]Так как мне эту картинку из OLE поля вытащить ?
Я пытался прочитать поле в TMemoryStream и сохранить его в файл, толь там какая то ерунда сохранилась.
← →
Arm79 (2003-05-30 17:46) [4]Попробуй тоже, но через ADOBLOBStream
← →
KoluChi (2003-05-30 17:52) [5]Посмотрите пример
uses Jpeg, RxGif;
//-------------------------------------------------------------------------
function GetGraphicClassByExt(Ext: String) : TGraphicClass;
begin
if (Ext = ".wmf") or (Ext = ".emf") then
Result := TMetafile
else if (Ext = ".gif") then
Result := TGifImage
else if (Ext = ".bmp") or (Ext = ".dib") then
Result := TBitmap
else if (Ext = ".jpeg") or (Ext = ".jpg") then
Result := TJPEGImage
else
Result := nil;
end;
//-------------------------------------------------------------------------
//------------------------------------------------------------------------------
function Tdtmdl_Main.GetPicture(PictureFieldName, PictureFieldFile: String): Boolean;
var
Field: TBLOBField;
DataSet: TDataSet;
FS: TFileStream;
FileName: String;
begin
Result := false;
DataSet := ds_Elements.DataSet;
if DataSet.IsEmpty then Exit;
LogMessage("Выгрузка картинки");
Field := TBLOBField(DataSet.FieldByName(PictureFieldName));
if VarIsNull(Field.Value) or (VarToStr(Field.Value) = "") then Exit;
FileName := DataSet.FieldByName(PictureFieldFile).Value;
SavePictureDialog.FileName := FileName;
SavePictureDialog.Filter := "*" + ExtractFileExt(FileName) + "|*" + ExtractFileExt(FileName);
Result := SavePictureDialog.Execute;
if Result then
try
FileName := SavePictureDialog.FileName;
if FileExists(FileName) then
FS := TFileStream.Create(FileName, fmOpenWrite + fmShareDenyNone)
else
FS := TFileStream.Create(FileName, fmCreate);
Field.SaveToStream(FS);
FS.Free();
except
on E: Exception do
LogErrorMessage("Ошибка при выгрузке картинки " + E.Message);
end;
end;
//------------------------------------------------------------------------------
procedure Tdtmdl_Main.SetPictureToImage(DataSet: TDataSet; Image: TImage; PictureFieldName, PictureFieldFile: String);
var
Stream: TStream;
Field: TBLOBField;
FileExt: String;
MF: TGraphic;
GClass: TGraphicClass;
begin
if not Assigned(Image) then Exit;
LogMessage("Прорисовка картинки");
Image.Picture.Assign(nil);
Image.Width := 1;
Image.Height := 1;
if DataSet.IsEmpty then Exit;
Field := TBLOBField(DataSet.FieldByName(PictureFieldName));
if not Field.IsNull then
begin
Stream := TMemoryStream.Create;
try
Field.SaveToStream(Stream);
Stream.Position := 0;
FileExt := LowerCase(ExtractFileExt(DataSet.FieldByName(PictureFieldFile).Value));
GClass := GetGraphicClassByExt(FileExt);
if Assigned(GClass) then
begin
MF := GClass.Create;
try
MF.LoadFromStream(Stream);
Image.AutoSize := true;
Image.Picture.Assign(MF);
finally
MF.Free();
end;
end;
finally
Stream.Free;
end;
end;
end;
//------------------------------------------------------------------------------
← →
Arm79 (2003-05-30 18:00) [6]Все правильно, но в примере TDataSet и, соответственно, TBLOBStream. А в вопросе идет речь о Access, и я понял, что работа идет через ADO.
← →
KoluChi (2003-05-30 18:06) [7]
> Arm79 © (30.05.03 18:00)
Этот кусок выдернут из программы, работающей с Access через ADO. Так что все OK :)
← →
ec (2003-05-31 18:38) [8]Удалено модератором
Примечание: Личная переписка
← →
sniknik (2003-05-31 20:09) [9]вот так положи и можно будет через стандартный TDBImage показывать.
st:= ADODataSet1.FieldByName("AUTOID").AsString;
ADOCommand1.CommandText:= "UPDATE MyTable SET ImField=:ImField WHERE AUTOID="+St;
ADOCommand1.Parameters.ParamByName("ImField").LoadFromFile("D:\Program Files\Common Files\Borland Shared\Data\cus2.bmp", ftGraphic);
ADOCommand1.Execute;
но в Access это будут просто бинарные данные (он не поймет что это картинка).
← →
ec (2003-06-02 13:29) [10]У меня уже есть в готовая база данных ACCESS с кучей картинок, мне надо из неё эти картинки повытаскивать и сохранить в BMP.
← →
sniknik (2003-06-02 13:59) [11]ec © (02.06.03 13:29)
а какого типа картинки? в Access посмотри. Если "Точечный рисунок" то это то же самое BMP, почти, только смещение в Stream-е делай (82) и сохраняй в файл. или если представлено как двоичные данные и первые байты "BM" то просто без смещения(вот тут возможны глюки, мало ли у кого BM в начале).
могу пример дать не прям то что тебе нужно но похожее, писал комуто. разберешся (даже если не разберешся из TImage есть сохранить в файл).
если другой тип то нужно преобразование.
← →
ec (2003-06-02 14:04) [12]Удалено модератором
Примечание: Личная переписка
← →
sniknik (2003-06-02 14:26) [13]отправил. там пример с базой забиты картинки какие он может открыть. архив rar-3.0. писано под D6. после компиляции нажать кнопку "Открыть таблицу" дальше поймеш.
← →
LordOfSilence (2003-06-02 16:38) [14]2 sniknik © (02.06.03 13:59)
А точно 82? Не 78? Или в разных случаях по разному?
← →
sniknik (2003-06-02 16:51) [15]не знаю, может и по разному, но сомневаюсь, иначе самому аксесу было бы неудобно, я бы сам например префикс переменной длинны делать не стал...
работает ... (подобрано методом научного тыка :о), шучу, считал байты), проверок на другие типы нет (даст ошибку, что картинка не та), для полной идентификации нужно весь префикс анализировать ... но влом. если бы где описание было можно бы чего поделать ради интереса, а так.., пока не надо чего себя утруждать?
if Stream.Size <> 0 then begin
Stream.Position:= 0;
Stream.ReadBuffer(Pref, 2);
if Pref = $4D42 then DBImage1.DataSource:= DataSource1
else begin
Stream.Position:= 82;
Image1.Picture.Bitmap.LoadFromStream(Stream);
end;
end;
← →
LordOfSilence (2003-06-02 17:17) [16]ок, спасибо за ответ.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.06.26;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.025 c