главная страница
материалы
  ms access и bitmap
  win в ucs-2 на perl
  приложение facebook
  медиа библиотека
  восстановление exif
  netgear stora
  html и javascript
  openwrt
  конвертация
  перекодировка для tv
  перекодировка для tvix

Преобразование рисунка 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;