Access

  MS Access 2010+  |  Bitmapa *.bmp  |   VBA 7.0

• Formant Rysunek (Image)

Formant ImageFormant Rysunek (Image) jest najczęściej wykorzystywany w programie Microsoft Access do prezentacji grafiki (rysunku) w formularzu lub w raporcie. Formant Rysunek (Image) można stosować zamiennie z formantem Niezwiązana ramka obiektu, w której można wyświetlać dowolny obiekt OLE, który nie jest przechowywany w tabeli. Przykładowo można wyświetlić w niezwiązanej ramce obiektu Wykres utworzony i zapisany w programie Microsoft Graph. Dodatkową zaletą niezwiązanej ramki obiektu jest możliwość edytowania obiektu w formularzu lub raporcie za pomocą aplikacji, w której prezentowany obiekt został utworzony. Główna zaletą formantu Rysunek (Image) jest o wiele większa szybkość wyświetlania prezentowanej grafiki, co jest dość istotne przy prezentowaniu większych obiektów graficznych.

Właściwość TypRysunku (PictureType) formantu Rysunek (Image)

Jeżeli właściwość TypRysunku (PictureType) zostanie ustawiona na wartość Połączony (Linked) to rozmiar bazy danych praktycznie nie wzrośnie, ponieważ program Microsoft Access przechowa tylko ścieżkę do pliku na dysku. Należy pamiętać, że po przeniesieniu pliku do innej lokalizacji należy ponownie ustanowić połączenie do tego pliku, używając w tym celu właściwości Picture. Rysunek połączony można modyfikować za pomocą oddzielnej aplikacji skojarzonej z typem połączonego pliku. Zmiany dokonane w rysunku pojawią się po ponownym wyświetleniu w bazie danych formantu Rysunek (Image).

Właściwość PictureData rysunków, dla których właściwość TypRysunku (PictureType) przyjmuje wartość Osadzony (Embedded) przechowuje wszystkie bajty, z których składa się rysunek. Dla tego typu rysunków (tj. osadzonych) rozmiar bazy danych powiększa się o rozmiar pliku rysunku, a w przypadku niektórych plików graficznych (*.wmf, *.emf) rozmiar ten może wzrosnąć dwukrotnie w stosunku do rozmiarów pliku rysunku.
      Począwszy od wersji Microsoft Access 2007+ w Menu: „Opcje programu Access”/„Bieżąca baza danych”/
„Format przechowywania właściwości obrazów” mamy do wyboru jedną z dwu opcji:

  • Zachowaj format obrazu źródłowego (mniejszy rozmiar pliku). Jeśli opcja ta jest zaznaczona, źródłowe pliki graficzne będą przechowywane w ich oryginalnym formacie. Po zaznaczeniu tej opcję, rozmiar bazy danych będzie mniejszy, ale proces wyświetlania plików graficznych wydłuży się, ponieważ program Access będzie musiał w locie konwertować oryginalne pliki do formatu bitmapy. Korzyść z zastosowania tej opcji jest tym większa, im większa jest różnica pomiędzy wielkością pliku skompresowanego np. *.jpeg, a wielkością pliku formatu *.bmp.
  • Konwertuj wszystkie dane obrazu na mapy bitowe (opcja ta jest zgodna z programem Access 2003 i wcześniejszymi wersjami). Jeżeli opcja ta jest zaznaczona, w programie Access tworzona jest kopia oryginalnego pliku obrazu w formacie mapy bitowej Windows lub mapy bitowej niezależnej od urządzenia (DIB). Opcję tą należy zaznaczyć, aby przeglądać obrazy w bazach danych utworzonych za pomocą programu Office Access 2003 i starszych wersji. Opcja ta jest także korzystna dla małych plików graficznych, ponieważ wzrost wielkości bazy jest nieznaczny a plik graficzny pokazywany jest natychmiast, bez jakichkolwiek opóźnień wynikających ze stosowania przez Access filtrów graficznych.
    W przypadku plików graficznych formatu BMP wielkość bazy jest mniejsza o 14 bajtów (wielkość nagłówka BitmapFileHeader) dla każdego pliku graficznego w porównaniu z opcją Zachowaj format obrazu źródłowego.

Właściwość Obraz (Picture) formantu Rysunek (Image)

Właściwość Picture definiuje ścieżkę dostępu wraz z nazwą pliku mapy bitowej lub grafiki innego typu, która zostanie wyświetlona w formancie Image. Jeżeli właściwość PictureType (Typ rysunku) ustawiona jest na wartość Osadzony (Embeded) grafika przechowywana jest wraz z obiektem.


' PictureType = 0 - Typ rysunku osadzony (embedded). Wartość domyślna.
'									  Rysunek jest osadzony w obiekcie i staje się częścią pliku bazy danych.
' PictureType = 1 - Typ rysunku połączony (linked). Rysunek jest połączony z obiektem.
'										Program Microsoft Access przechowuje wskaźnik do miejsca na dysku
'										w którym znajduje się rysunek.

'	Me.imgObrazek.PictureType = 0 'Rysunek jest typu Osadzony (embedded)
	Me.imgObrazek.PictureType = 1 'Rysunek jest typu Połączony (linked)
	Me.imgObrazek.Picture = "C:\Folder\NazwaPliku.bmp"
 

Właściwość PictureData formantu Image

Microsoft Access przechowuje wyświetlaną bitmapę we właściwości PictureData. Właściwość PictureData jest binarną reprezentacją wyświetlanej bitmapy i jest do odczytu i zapisu we wszystkich widokach. Możliwych jest kilka sposobów przechowywania wyświetlanej bitmapy:

  1. w innym obiekcie np. ukrytym formancie Rysunek (Image),
    Przycisk (CommandButton), czy Przełącznik (ToggleButton)
  2. w zmiennej tablicowej typu Byte
  3. w zmiennej typu Variant
  4. w tabeli, w polu typu OLE Object
  5. w tabeli, w polu typu Nota (binarnie)
Dim bytPictureData() As Byte
Dim varPictureData   As Variant
 
	With Me.imgObrazek   
		.Picture = "C:\Folder\NazwaPliku.bmp"
		bytPictureData = .PictureData						'przypisz do zmiennej tablicowej typy Byte
		varPictureData = .PictureData						'przypisz do zmiennej typu Variant
		Me.imgInny.PictureData = .PictureData		'przypisz do innego formantu Image 
	End With
 
End Sub
 

Właściwości PictureData można użyć, aby wyświetlać różne rysunki tła w formularzu, zależnie od działań użytkownika. Można na przykład otwierać roboczy formularz i używając różnych rysunków tła, zależnie od tego, czy jest on otwierany do wprowadzania danych, czy do przeglądania. Właściwość PictureData można użyć razem ze zdarzeniem Timer i właściwością TimerInterval (OkresCzasomierza), aby wykonać na formularzu prostą animację.

Właściwość PictureData faktycznie jest tablicą bajtów, a dla bitmapy 24-bitowej pierwsze 40 bajty to nagłówek BitmapInfoHeader. Następne bajty tablicy określają kolor kolejnych pikseli bitmapy. Taką tablicę bajtów określa się mianem upakowana DIB, lub skrótowo DIB. Określenie to odnosi się do 24 bitowej nieskompresowanej bitmapy określanej jako „z dołu do góry” lub „do góry nogami”, przypisanej do właściwości PictureData roboczego formantu Rysunek (Image).

Wraz z pojawieniem się Microsoft Access 2007+ i nową właściwością bieżącej bazy danych „Format przechowywania właściwości obrazów” pojęcie „upakowana DIB” straciło swoją jednoznaczność. W wersji MS Access 2003 i niższych „upakowana DIB” zaczyna się za nagłówkiem BitmaFileHeader, czyli od 15-go bajtu pliku bitmapy i zawiera pozostałe bajty bitmapy. Obecnie w MS Access 2007+, gdy właściwość „Format przechowywania właściwości obrazów” ustawiona zostanie przez użytkownika na opcję „Zachowaj format obrazu bitowego”, właściwość Image.PictureData zawierać będzie wszystkie bajty pliku bitmapy. Jeżeli użytkownik wybierze opcję „Konwertuj wszystkie dane obrazu na mapy bitowe (zgodnie z programem Access 2003 i wcześniejszymi wersjami)” zawierać będzie „upakowaną DIB”. Ponieważ pojęcie „upakowana DIB” straciło swoją jednoznaczność, bezpieczniej będzie, jeżeli będę używał terminu „NazwaFormantu.PictureData” .

Duży plik bitmapy ok.200mb w formancie Image

Aby wyświetlić bitmapę w formancie Image możemy skorzystać z poniższych sposobów:

Me.imgObrazek.PictureData = bytTablicaDIB()

O ile nie ma większych problemów podczas wyświetlania  małych bitmap o wielkości zbliżonej do wielkości formantu Image (Rysunek), to przy większych rozmiarach bitmapy i konieczności skalowania obrazu przez aplikację Access wyświetlany obraz końcowy pozostawia wiele do życzenia. Test wykonałem wczytując „Image.PictureData” 24-bitowej nieskompresowanej bitmapy o wymiarach 9500x7000 pikseli (wielkość ok. 190 MB) w następujących wersjach programu Microsoft Access: 2000, 2003, 2007, 2010, 2016.

Upakowana DIB dużego pliku bitmapy

Podobny efekt zaobserwowałem, gdy zrezygnowałem z pobierania Image.PictureData, na rzecz bezpośredniego przypisania do właściwości formantu Image.PictureData ścieżki dostępu wraz z nazwą pliku mapy bitowej.

Me.imgObrazek.Picture = "C:\Folder\NazwaPliku.bmp"

W ten sposób Access sam miał zadbać o wyświetlanie obrazu bitmapy. Ponownie Access, a właściwie formant Image (Rysunek) nie dał sobie rady z wyświetlaniem, a raczej ze skalowaniem bardzo dużej bitmapy.
W każdym przypadku, bez względu na wersję Access zaobserwowałem:

  • Beznadziejną reprezentacja kolorów elementów skalowanego obrazu bitmapy. Widoczne nienaturalne kolory elementów bitmapy i ich krawędzi - Wszystkie wersje Microsoft Access.
  • W Access 2007+ wczytywana Image.PictureData była w miarę poprawnie wyświetlana, ale czasami po zmianie rozmiaru formularza obraz bitmapy przyjmował wygląd opisany w pkt. 1.
  • Przy zmianie rozmiarów formularza (wymuszenie przemalowania okna formularza wraz zawartością) występuje bardzo brzydkie migotanie okna formantu Rysunek (Image) zawierającego obraz bitmapy.

Nienaturalny wygląd bardzo dużej bitmapy w formancie Image wynika tylko i wyłącznie z nieprawidłowego skalowania (resamplingu) bitmapy. Ta sama bitmapa, a raczej jej niewielki fragmencik, wyświetlany przy ustawieniu właściwości Tryb wymiarowania (PictureSizeMode) = 0 (Obetnij) prezentuje się poprawnie.

Duży plik bitmapy. Tryb wymiarowania Obetnij 

Począwszy od Microsoft Access 2007+ istnieje możliwość ustawienia w opcjach bieżącej bazy danych formatu przechowywania właściwości obrazów na wartość „Zachowaj format obrazu źródłowego (mniejszy rozmiar pliku)”. Tak naprawdę (dla bitmap) rozmiar bazy zwiększy się o 14 bajtów, jeżeli plik bitmapy byłby przechowywany w formancie Image (Rysunek) w formularzu. 14 dodatkowych bajtów w porównaniu do 190 MB zawartych w pliku bitmapy, to wielkość całkowicie do pominięcia.

Upakowana DIB dużego pliku bitmapy 

Na pierwszy rzut oka widać, że bezpośrednie przypisanie do właściwości formantu Image.Picture pełnej ścieżki dostępu do pliku mapy bitowej, w połączeniu z ustawioną opcją „Zachowaj format obrazu bitowego”jest bardzo dobrym rozwiązaniem. Prawdopodobnie programiści Microsoft dla tej opcji poprawili filtr graficzny odpowiedzialny za skalowanie bitmapy.

Można powiedzieć, że dla wersji Access 2007+ nie ma, jak na razie, większych problemów z wyświetlaniem w miarę dużej grafiki (plików *.bmp). Ale czy plik *bmp wielkości ok. 250MB jest duży, bardzo duży, czy ogromny ?

Nie można jednoznacznie określić wielkości pliku, dla której Access odmawia współpracy. Access 2007 protestuje najwcześniej, już przy wielkości pliku *.bmp ok. 250MB i przy ustawionej opcji „Konwertuj wszystkie dane obrazu na mapy bitowe” Access 2007 zgłasza komunikaty, że nie daje rady.

Brakuje pamięci by wczytać plik bmp 

Nie jest obsługiwany, lub jest zbyt duży 

Trochę lepiej wygląda wczytywanie dużych plików *.bmp przy ustawionej opcji „Zachowaj format obrazu bitowego”. Przede wszystkim bitmapa jest bardzo dobrze reskalowana, ale nigdy nie wiadomo kiedy Access 2007+ odmówi współpracy i zgłosi pokazane wyżej komunikaty.