Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.024 c
1-84119
DJ Vano
2003-06-10 23:15
2003.06.26
Создание компонента в Run Time


9-83849
Карлсон
2003-01-12 18:20
2003.06.26
просто интересно, почему.


14-84704
linker
2003-06-05 11:53
2003.06.26
как получить текст из DBGrid


1-84224
Тих
2003-06-12 23:15
2003.06.26
ФОрматирование даты


14-84632
Berzercer
2003-06-09 18:09
2003.06.26
Общение в одну сторону? Ну, ладно.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский