Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
ВнизJPG картинку в базу как запихнуть? Найти похожие ветки
← →
harismatik (2002-11-07 14:45) [0]Я тут видел в форуме вариант через TBLOBField, но почему то в одну таблицу запихнуть удалось, а в другую ну никак. Код абсолютно идентичен, а программа выдает ошибку "Bitmap is not valid". Привожу фрагмент своего кода:
procedure TObjectForm.MapButtonClick(Sender: TObject);
var f:TFileStream; jpg:TJPEGImage; Bmp:TBitmap;
l:word; ext:string;
begin
if OpenMapDialog.Execute then
begin
l:=length(OpenMapDialog.FileName);
ext:=Copy(OpenMapDialog.FileName,l-3,4);
if (ext=".bmp") or (ext=".BMP") then
begin
f:=TFileStream.Create(OpenMapDialog.Filename,fmOpenRead);
f.Position:=0;
bmp:=TBitmap.Create;
bmp.LoadFromStream(f);
Image1.Picture.Assign(bmp);
Table1.Edit;
TBLOBField(Table1.FieldByName("PHOTO")).LoadFromStream(f);
Table1.Post;
bmp.Free;
f.Free;
end;
if (ext=".jpg") or (ext=".JPG") then
begin
f:=TFileStream.Create(OpenMapDialog.Filename,fmOpenRead);
f.Position:=0;
jpg:=TJPEGImage.Create;
jpg.LoadFromStream(f);
Table1.Edit;
TBLOBField(Table1.FieldByName("PHOTO")).LoadFromStream(f);
Table1.Post;
Image1.Picture.Assign(jpg);
DBImage1.Picture.Assign(jpg);
jpg.Free;
f.Free;
end;
end
else Image1.Refresh;
end;
Кто подскажет причину?
← →
Prooksius (2002-11-07 17:09) [1]Вот рабочий кусок кода. Сохраняется в JPEG, т.к. мало места занимает. Процедура GetBitmapFromImg переводит картинку из разных форматов в JPEG. В Query.SQL текст типа
update table TABLENAME
set Photo = :MyParam
where ID = :ID
Transaction.StartTransaction.
bs := TFIBBlobStream.Create;
try
Bitmap := TBitmap.Create;
JPEGImg := TJPEGImage.Create;
bs.Mode := bmWrite;
bs.Database := DataBase;
bs.Transaction := Transaction;
bs.Truncate;
GetBitmapFromImg(DBPhoto.Picture, Bitmap);
JPEGImg.Assign(Bitmap);
JPEGImg.CompressionQuality := 50;
JPEGImg.Compress;
JPEGImg.SaveToStream(bs);
bs.Finalize;
Query.ParamByName("MyParam").AsQuad := bs.BlobID;
Query.ExecQuery;
Transaction.Commit;
finally
JPEGImg.Free;
Bitmap.Free;
bs.Free;
end;
← →
harismatik (2002-11-07 17:17) [2]2 Prooksius
Знаешь, мой кусок кода тоже рабочий. Когда я в него подстывляю вместо Table1 Table2, связанную с другой таблицей, в которой есть тоже BLOB поле PHOTO, то все работает. Значит, проблема не в коде, а в самой таблице. Но где? Вот код создания таблицы на SQL:
CREATE TABLE READERS
(
RDR_IND INTEGER NOT NULL,
OBJ_NAM CHAR(20),
OBJ_NUM INTEGER,
OBJ_TYPE INTEGER,
RCH INTEGER,
OBJ_MODE CHAR(1),
KADRY CHAR(1),
OBJ_PERIOD CHAR(4),
OBJ_SHIEF CHAR(35),
OBJ_TEL CHAR(13),
RSN INTEGER,
RDR_ENDIR INTEGER,
RDR_OBJ INTEGER,
STATUS INTEGER,
PHOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
OBJ_LOCK INTEGER,
RDR_ID SMALLINT NOT NULL,
TIMEOPENDOOR SMALLINT,
GROUP_NUM SMALLINT,
RDR_INF INTEGER,
RDR_BUS SMALLINT,
RDR_PASS SMALLINT,
SEGM INTEGER,
OBJ_PRZ SMALLINT,
PRIMARY KEY (RDR_IND)
);
Это код таблицы, которая не работает с моим кодом.
А это код создания таблицы, которая работает:
CREATE TABLE STAT
(
WRK_NUM INTEGER NOT NULL,
NAME CHAR(35),
POST CHAR(25),
SECTN INTEGER,
CARD_NUM CHAR(10),
WRK_CAT CHAR(10),
WRK_SHIFT INTEGER,
SPEC_ACS CHAR(1),
PHOTO BLOB SUB_TYPE 0 SEGMENT SIZE 80,
TAB_NUM CHAR(10),
WHOGIVECARD CHAR(35),
DATEGIVECARD CHAR(10),
WRK_APB INTEGER,
PRIMARY KEY (WRK_NUM)
);
В чем же тут загвоздка?
← →
iNew (2002-11-07 18:16) [3]Скажите а разве нельзя прост сделать так:
Query1.Edit;
Query1Foto2.LoadFromFile(OpenPictureDialog1.FileName);
Query1.Post;
← →
harismatik (2002-11-07 18:37) [4]2 iNew
Можно, но для jpeg не получится
2 All
Предидущий вопрос снимаю - код был правильным, но ошибка появлялась из-за того, что на другой форме компонент DBImage был связан с этим полем, а он к сожалению не может отображать jpeg картинки без их предварительной обработки. Но дело в том, что при открытии таблицы в этот компонент сразу выводится содержимое поля BLOB. Можно ли где-то вставить обработчик, чтоб в DBImage выводилась картинка из базы? Если можно, то где? Иначе приходится пользоваться компонентом Image.
← →
iNew (2002-11-08 10:50) [5]Я делал так:
Query1.Edit;
Query1Foto2.LoadFromFile(OpenPictureDialog1.FileName);
Query1.Post;
Причем файл jpg. затем:
procedure TMainForm.DataSource1DataChange(Sender: TObject; Field: TField);
var i : integer;
Stream1: TStream;
ijpg : TJPEGImage;
begin
Image1.Picture.Assign( nil );
if Query1Foto1.IsNull=false then
begin
try
Stream1 := TMemoryStream.Create;
ijpg := TJPEGImage.Create;
Query1Foto1.SaveToStream(Stream1);
Stream1.Position := 0;
ijpg.LoadFromStream( Stream1 );
Image1.Picture.Assign( ijpg );
Stream1.Free;
ijpg.Free;
except
end;
end;
end;
← →
harismatik (2002-11-08 13:26) [6]2 INew
С компонентом TImage все четко получается, а как быть с TDBImage, который СВЯЗАН с этим BLOB полем?
← →
АнКа (2002-11-08 14:41) [7]Попробуйте
uses ....,jpeg;
В том модуле формы, где DBImage. Вроде, ругаться не будет.
DBImage1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
А вот встречный вопрос: как вывести теперь эту картинку на печать?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.11.25;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c