Преобразование рисунка MS Access в Bitmap и обратно
Если в базе данных MS Access используется поле объекта OLE для рисунков,
которые помещаются туда с помощью Copy-Paste или Drag-and-Drop, то
такие рисунки будут отображаться в самой базе, но ими нельзя воспользоваться
в стороних программах напрямую.
При вытаскивании данных из этого поля, все таки можно их так преобразовать,
чтобы получить рисунок Bitmap.
Скопированные картинки из Google Chrome непосредственно в базу,
к сожалению, не преобразовываются.
Работает, если скопировать картинку через какой-либо редактор.
Из Explorer'а и различных редакторов - работает.
Вариант 1. PHP
Для PHP можно воспользоваться немного измененным модулем bmp.php,
названным "bmp_ole.php" для создания картинки библиотеки libgd.
Для этого необходимо записать данные из базы данных в файл
и применить функцию imagecreatefrombmp.
В примере создана база данных MySQL,
которая заполняется с помощью MS Access.
$query - запрос одной картинки из базы.
include "bmp_ole.php";
$fo=fopen("bmp.ole","w");
fwrite($fo,mysql_result(mysql_query($query),0,0));
fclose($fo);
header("Content-Type: image/jpeg");
imagejpeg(imagecreatefrombmp("bmp.ole"));
unlink("bmp.ole");
|
Скачать 1,91 КБ
Вариант 2
Преобразовываются данные следующим образом. Необходимо первые 57
байт заменить на шапку 'BM'#0#0#0#0#0#0#0#0#0#0#0#0 или
'BM'#0#0#0#0#0#0#0#0#54#0#0#0, в зависимости от приложения.
PHP
В примере создана база данных MySQL,
которая заполняется с помощью MS Access.
$query - запрос одной картинки из базы.
header("Content-Type: image/bmp");
$hd = "BM".chr(0).chr(0).chr(0).chr(0);
$hd = $hd.chr(0).chr(0).chr(0).chr(0);
$hd = $hd.chr(0).chr(0).chr(0).chr(0);
print $hd;
$pics = mysql_query($query);
$pic = substr(mysql_result($pics,0,0),57);
print $pic;
|
Delphi
В примере
ADOTablepicture - поле базы данных MS Access
с картинками,
img - TImage, в котором нужно отобразить картинку.
procedure ShowImage;
var str:TMemoryStream;
strb:TMemoryStream;
hd: array [1..16] of char;
hdsize:integer;
const head='BM'#0#0#0#0#0#0#0#0#54#0#0#0;
begin
if Form1.ADOTablepicture.BlobSize > 57 then begin
str:=TMemoryStream.Create;
strb:=TMemoryStream.Create;
str.Write(head,14);
Form1.ADOTablepicture.SaveToStream(strb);
strb.Seek(20,soFromBeginning);
strb.Read(hd,16);
if hd = 'Точечный рисунок' then hdsize:=96
else if leftstr(hd,7) = 'Рисунок' then hdsize:=57
else exit;
strb.Seek(hdsize,soFromBeginning);
str.CopyFrom(strb,strb.Size-hdsize);
str.Seek(0,soFromBeginning);
img.Picture.Bitmap.LoadFromStream(str);
strb.Free;
str.Free;
end else img.Picture:=nil;
end;
|
Обратные преобразования
procedure SavePictureToDB(p:TPicture);
var str,strb:TMemoryStream;
h:longint;
hb:array [1..4] of byte;
i:integer;
const
head1=#21#28#51#0#2#0#0#0#17#0#14#0#20#0#37#0;
head2='яяяяТочечный рисунок'#0'Paint.Picture';
head3=#0#1#5#0#0#2#0#0#0#7#0#0#0;
head4='PBrush'#0#0#0#0#0#0#0#0#0;
tail1=#0#0#0#0#0#0#0#0;
tail2=#0#0#1#5#0#0#0#0#0#0#0#173#5#254;
begin
str:=TMemoryStream.Create;
strb:=TMemoryStream.Create;
p.Bitmap.SaveToStream(strb);
str.Write(head1,16);
str.Write(head2,34);
str.Write(head3,13);
str.Write(head4,15);
h:=strb.Size+26;
for i:=1 to 4 do begin
hb[i]:=h mod 256;
h:=h div 256;
end;
str.Write(hb,4);
strb.Seek(0,soFromBeginning);
str.CopyFrom(strb,strb.Size);
str.Write(tail1,8);
str.Write(tail1,8);
str.Write(tail1,8);
str.Write(tail2,14);
strb.Seek(0,soFromBeginning);
ADOTablepicture.LoadFromStream(str);
strb.Free;
str.Free;
end;
|
|