Rozdział monografii: `Bazy Danych: Rozwój metod i technologii

Transkrypt

Rozdział monografii: `Bazy Danych: Rozwój metod i technologii
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Rozdział 24
w
w
Wykorzystanie Oracle interMedia
do przechowywania danych multimedialnych
w Oracle 10g
1 Wstęp
da
.b
w
Streszczenie. Specyfikacja języka SQL nie uwzględnia obsługi medialnych
typów danych. Dopiero standard SQL/MM w dużej części rozwiązuje ten
problem. W systemie Oracle za obsługę multimedialnych typów danych
odpowiada moduł Oracle interMedia. Dzięki niemu baza danych jest w stanie
przechowywać, zarządzać i pobierać różnego rodzaju heterogeniczne dane
tj. obrazki, pliki audio, wideo. Celem rozdziału jest przedstawienie problemu
dotyczącego zarządzania typem danych ORDImage, który służy do manipulacji obrazami i jest jako jedyny dość dobrze wspierany przez Oracle 10g.
pl
s.
Dzisiejsze bazy danych to nie tylko relacje pomiędzy tabelami i tekst czy liczby w krotkach. System zarządzający bazą musi także obsługiwać różnego rodzaju dane multimedialne tj. grafikę, strumienie audio czy wideo. Z definicji dane multimedialne to dane, niosące
ze sobą kilka potoków informacji, np. dane wideo zawierają obraz, zazwyczaj także ścieżkę
dźwiękowa a niekiedy nawet uzupełnione są o dane tekstowe. Mówiąc o grafice jako danych multimedialnych, mamy na myśli raczej praktyczną definicję, która skupia się na prezentacji przez maszynę cyfrową zakodowanych informacji w sposób zrozumiały dla człowieka. W świetle tak sformułowanego pojęcia multimediów obrazy z całym powodzeniem
możemy zaliczać do tej grupy.
Oracle 10g do obsługi danych multimedialnych wykorzystuje moduł interMedia, który
jest zgodny ze standardem SQL/MM. SQL/MM (MM od MultiMedia) znany również pod
nazwą SQL Multimedia and Application Packages. Rozszerza on standard SQL99 o obsługę nowych, specyficznych typów danych dedukowanych właśnie do przechowywania
multimediów.
Na chwilę obecną typem w pełni wspieranym i obsługiwanym przez interMedia jest
ORDImage i na nim skupimy uwagę w tym rozdziale. W podrozdziale 2 zostanie przedstawiona budowa, atrybuty i metody, a w podrozdziale 3 praktyczne wykorzystanie obiektów
graficznych.
Andrzej Barczak, Dariusz Zacharczuk
Akademia Podlaska, Instytut Informatyki, ul. 3 Maja 54, 08-110 Siedlce, Polska
email: [email protected], [email protected]
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
2 Budowa i metody ORDImage
w
Wszystkie typy multimedialne w Oracle interMedia oparte są na zagnieżdżonym obiekcie
ORDSYS.ORDSource (atrybut: <obiekt>.source), który posiada podstawowe mechanizmy
i atrybuty do pracy na danych. ORDSource pozwala na dostęp do lokalnych zmiennych
BLOB, zewnętrznych plików BFILE, zewnętrznych adresów URL na serwerach http. Atrybuty tego obiektu zawierają informacje o typie źródła danych (srcType), lokalizacji źródła
(srcLocation), nazwie obiektu (srcName), dacie modyfikacji (updateTime) fladze informującej czy dane są przechowywane lokalnie czy też nie (local) oraz same dane w postaci
BLOB (localData).
Metody, tak jak i zmienne typu ORDSource są wspólne dla wszystkich typów obiektowych (z wyjątkiem obiektów Still Image). Metody uruchamiane na poziomie ORDSource
używają wtyczek posługujących się uchwytami do źródła danych w celu jego przetwarzania. Jako pierwszy argument przyjmują zmienną ctx typu RAW. Przed jakimkolwiek wywołaniem jednej z takich metod po raz pierwszy, użytkownik powinien zadeklarować
strukturę ctx oraz zainicjować ją wartością NULL. Następnie należy wywołać metodę
openSource() a po przetworzeniu danych closeSource(). Tabela 1 zawiera krótką charakterystykę funkcji i procedur omawianego obiektu.
w
w
Format
deleteContent();
da
.b
Tabela 1. Opis wybranych metod podstawowego typu danych multimedialnych
ORDSource.
getContent()
RETURN BLOB;
getSource()
RETURN
VARCHAR2;
pl
s.
export(
ctx IN OUT RAW,
source_type IN
VARCHAR2,
source_location IN
VARCHAR2,
source_name IN
VARCHAR2
);
Komentarz
Kasuje zawartość BLOB atrybutu source.localData i ustawia
zmienną source.local na zero. Aktualizuje także source.updateTime. Ta metoda może być użyta po eksporcie danych
z lokalnego źródła na zewnątrz bazy jeżeli dane nie będą dłużej
potrzebne albo kiedy chcemy zastąpić stary obiekt obiektem nowym.
Kopiuje dane ze zmiennej typu BLOB (source.localData) do
źródła zewnętrznego. Metoda ta zapewnia wsparcie tylko kiedy
source_type ma wartość ‘FILE’. W takim przypadku dane są
zapisywane do pliku w katalogu podanego parametrem
source_location, do którego Oracle ma dostęp. Nazwa pod jaką
zostaną zapisane dane podawana jest jako parametr ostatni. Po
wyeksportowaniu danych można użyć metody clearLocal() aby
wskazać, że dane są przechowywane na zewnątrz bazy danych.
Nie jest ona bowiem automatycznie wywoływana, w odróżnieniu
do odwrotnej metody import(), którą niejawnie wywołuje
setLocal(). Można również użyć metody deleteContent() jeśli
chcemy skasować zawartość atrybutu source.localData.
Zwraca uchwyt typu BLOB do atrybutu source.localData.
Zwraca informacje nt. zewnętrznej lokalizacji danych w formacie
URL. Są to informacje z atrybutów: source.srcType,
source.srcLocation i source.srcName.
Wartości, jakie może zwrócić funkcja:
FILE://<DIR OBJECT NAME>/<FILE NAME> dla pliku
HTTP://<URL> dla HTTP
Np.: file://DARO_DIR/interMedia.bmp
272
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Instrukcje dla autorów referatów Konferencji Naukowej BDASg
w
isLocal()
Zwraca TRUE jeżeli dane są przechowywane lokalnie
RETURN BOOLEAN; (source.local=1, dane w formie BLOB) lub FALSE w przeciwnym wypadku.
setLocal();
Ustawia atrybut source.local tak, aby wskazywał, że dane są
przechowywane wewnątrz bazy danych jako BLOB. Jeśli atrybut
jest już ustawiony, wtedy metoda szuka odpowiednich danych
wskazywanych przez atrybut source.localData.
setUpdateTime(
Ustawia datę modyfikacji obiektu (source.srcUpdateTime). Nacurrent_time DATE leży używać tej metody za każdym razem gdy dane są mody);
fikowane. Metody, które zmieniają atrybuty obiektu oraz
wszystkie metody ustawiające dostęp do mediów wywołają tą
metodę domyślnie.
w
da
.b
w
Typ graficzny jako jedyny z typów multimedialnych na dzień dzisiejszy jest bardzo dobrze rozbudowany i obsługiwany w Oracle interMedia. Przyczyną tego stanu rzeczy jest fakt
że, obrazy są chyba najprostszym typem multimedialnym, jednocześnie najbardziej rozpowszechnionym co sprawia, że obsługa właśnie tego formatu danych jest sprawą priorytetową. Poza tym formaty graficzne są praktycznie niezmienne od kilku a nawet kilkunastu
lat. Natomiast dla danych audio czy wideo w ostatnich latach powstało wiele nowych formatów danych, głównie w celu łatwiejszej prezentacji w sieci Web.
Praca z obrazami w Oracle nie jest bardzo skomplikowana. Należy jednak pamiętać
o kilku rzeczach, które umożliwią poprawne wykonywanie operacji. Jeżeli manipulujemy
źródłem danych samodzielnie (czy to bezpośrednio modyfikując BLOB czy też zmieniając
źródło zewnętrzne) to po takich działaniach należy upewnić się, czy atrybuty obiektu
(krótki opis wybranych atrybutów ORDImage przedstawia tabela 2) są właściwie zsynchronizowane i czy data modyfikacji została zaktualizowana. W przeciwnym wypadku dane
w bazie będą niezgodne z rzeczywistością.
Tabela 2. Opis wybranych atrybutów typu ORDImage.
Nazwa
SOURCE
Typ
ORDSYS.ORDSOURCE
NUMBER(38)
WIDTH
NUMBER(38)
Szerokość obrazu w pikselach.
CONTENTLENGHT
NUMBER(38)
Rozmiar obrazu na dysku w bajtach.
FILEFORMAT
VARCHAR2(4000)
CONTENTFORMAT
VARCHAR2(4000)
Typ pliku lub format w jakim obraz
jest przechowywany np.: TIFF
(Tagged Image File Format), JFIF
(JPEG File Interchange Format).
Typ zawartości obrazka np.: monochromatyczny, 8 bitowa skala odcieni szarości.
Rodzaj algorytmu kompresji, jaki został użyty na obrazie.
COMPRESSIONFOR VARCHAR2(4000)
MAT
pl
s.
HEIGHT
Komentarz
Obiekt ORDSource, który jest podstawą każdego typu do przechowywania
danych multimedialnych w interMedia.
Wysokość obrazu w pikselach.
273
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
2.1 Zarządzanie obrazami za pomocą wbudowanych metod ORDImage.
w
Tworząc instancję obiektu ORDImage możemy posłużyć się jednym z dwóch konstruktorów:
− init() ) RETURN ORDImage;
− init(srcType, srcLocation, srcName) RETURN ORDImage.
Pierwszy z nich jest statyczną metodą inicjującą wszystkie atrybuty wartością NULL,
z małymi wyjątkami:
− Source.updateTime jest ustawiany na SYSDATE,
− Source.local przyjmuje wartość 1,
− Source.loclData jest ustawiany jako empty_blob (w przypadku ustawienia
tego atrybuty na NULL nie można było by w przyszłości zapisać
jakichkolwiek danych pod tą zmienna).
Drugi z konstruktorów przypisuje także wartości NULL do wszystkich atrybutów po za:
− Source.updateTime, który jest ustawiany na SYSDATE,
− Source.local przyjmuje wartość 0 ze względy na podane parametrami
informacje o pliku zewnętrznym,
− Source.srcType, source.srcLocation i source.srcName przyjmują wartość
parametrów odpowiednio srcType, srcLocation i srcName.
W tabeli 1 zostały przedstawione metody wspólne dla obiektów multimedialnych, które
powiązane były z typem ORDSource. Tabela 3 zaś opisuje procedury i funkcje specyficzne
dla obiektu ORDImage, dzięki którym możliwa jest manipulacja danymi.
da
.b
w
w
Tabela 3. Opis wybranych metod typu ORDImage
Format
checkProperties()
RETURN BOOLEAN;
getCompressionFormat()
RETURN VARCHAR2;
getContentFormat()
RETURN VARCHAR2;
getFileFormat()
RETURN VARCHAR2;
getHeight()
RETURN INTEGER;
getWidth()
RETURN INTEGER;
import(
ctx IN OUT RAW
);
pl
s.
copy(
dest IN OUT ORDImage
);
Komentarz
Funkcja weryfikuje, czy właściwości przechowywane
w atrybutach obiektu zgadzają się z faktycznymi atrybutami obrazka. Nie należy używać tej metody dla formatów
nie obsługiwanych przez interMedia.
Kopiuje obrazek wraz ze wszystkimi jego atrybutami. Jeśli
dane są przechowywane lokalnie, wtedy metoda ta kopiuje
zawartość BLOB do miejsca przeznaczenia podanego parametrem. Wywołanie tej metody powoduje skopiowanie
informacji o zewnętrznym źródle nawet jeżeli dane są przechowywane lokalnie.
Zwraca wartość atrybutu compressionFormat danego
obiektu np.: JPEG
Zwraca wartość atrybuty contentFormat np.: 24BITRGB.
Zwraca wartość atrybutu fileFormat np.: JFIF.
Funkcje zwracają wysokość i szerokość obrazka w pikselach.
Transferuje dane obrazu z zewnętrznego źródła danych
do lokalnego. Jeżeli atrybuty potrzebne do importu danych
(source.srcType, source.srcLocation, source.srcName) nie
274
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Instrukcje dla autorów referatów Konferencji Naukowej BDASg
w
w
Metoda jest podobna do import() z tą różnicą, że parametry
o źródle są przekazywane metodzie. Zasada działania jest
identyczna.
da
.b
w
importFrom(
ctx IN OUT RAW,
source_type IN
VARCHAR2,
source_location IN
VARCHAR2,
source_name IN
VARCHAR2
);
process(
command IN VARCHAR2
);
są ustawione, należy posłużyć się metodą serSource()
przed wykonaniem importu.
Po imporcie danych informacje o źródle danych pozostają niezmienione (ścieżka do pliku skąd dane zostały pobrane).
Import powoduje domyślne wywołanie metody setUpdateTime() oraz setLocall(). Jeśli format pliku importowanego
obrazu nie jest ustawiony na ciąg znaków zaczynający się
od „OTHER”, metoda setProperties() jest także wywoływana.
Import jest wykonywany na poziomie ORDSource,
który używa pakietu PL/SQL UTL_HTTP do importu danych z adresów http. Do ustawienia zmiennych połączenia
Proxy można wykorzystać zmienne środowiskowe.
Import obrazu z podanego zewnętrznego źródła.
setProperties( );
pl
s.
processCopy(
command IN
VARCHAR2,
dest IN OUT ORDImage
);
Wykonuje żądane operacje na pliku (BLOB). Metoda ta
nie wywołuje domyślnie importu jeśli dane są na zewnątrz
bazy. Użytkownik musi sam zadbać o to, aby dane były
przechowywane wewnątrz.
Po wykonaniu procedury automatycznie są wykonywane: setProperties(), setUpdateTime() i setMimeType().
Możliwe atrybuty i ich wartości przedstawione zostały
w tabeli 5.
Metoda kopiuje obraz przechowywany wewnątrz lub na
zewnątrz bazy do innego obrazu przechowywanego w bazie danych oraz wykonuje na kopii operacje podane parametrem command.
Nie można podać tego samego obrazu jako obiektu
źródła i przeznaczenia.
Możliwe atrybuty i ich wartości przedstawione zostały
w tabeli 5.
Metoda czyta dane obrazu aby uzyskać wartości atrybutów
obiektu, następnie zapisuje je pod odpowiednimi zmiennymi. Obraz może być przechowywany zarówno lokalnie jak
i zewnętrznie. Jeśli obiekt nie jest typu BFILE, metoda
wczytuje dane do tymczasowego obiektu typu BLOB w celu ustalenia charakterystyki obrazu.
Metodę tą powinno się wywoływać po kopiowaniu,
przetwarzaniu oryginalnego obrazu aby zbadać właściwości nowego obiektu. Wyjątkiem są sytuacje gdzie metoda
zostaje wywołana niejawnie.
275
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
w
Następujące informacje są weryfikowane i zapisywane:
− wysokość w pikselach,
− szerokość w pikselach,
− rozmiar danych w bajtach na dysku,
− typ pliku (TIFF, JFIF...)
− typ obrazu (monochromatyczny...)
− rodzaj zastosowanej kompresji (JPEG,
LZW...)
− typ MIME.
Metoda ta niejawnie wywołuje: setUpdateTime()
i setMimeType().
w
da
.b
w
Operacje wykonywane na obiektach ORDImage możemy podzielić na dwie grupy:
− zarządzające danymi zewnętrznymi i sposobem przechowywania obiektów
oraz
− metody wpływające na zawartość źródła danych.
Do drugiej grupy zaliczymy tylko dwie procedury: process() oraz processCopy(). Obie one
przyjmują jako parametr komendę, która identyfikuje rodzaj i sposób operacji na obrazie.
W tabeli 4 zostały opisane atrybuty oraz ich wartości, jakie możemy przekazywać do wyżej
wymienionych metod w celu wykonania poszczególnych operacji.
Tabela 4. Wybrane operatory umożliwiające przetwarzanie obrazów przy użyciu metod
process() lub processCopy()
Operator
Możliwe wartości
Opis działania i przyjmowane wartości
compressionFormat
pl
s.
JPEG, SUNRLE, BMPRLE, TARGARLE, LZW, LZWHDIFF,
FAX3, FAX4, HUFFMAN3, PACKBITS, GIFLZW, ASCII,
RAW, DEFLATE, NONE
Wymusza format kompresji wyjścia – jeśli jest obsługiwany dla pliku w aktualnym
formacie. Zazwyczaj bardzo ograniczone modyfikacje możemy wykonywać na
plikach z kompresją stratną. Natomiast najlepszy format dla celów testowych to
BMP, z uwagi na to, iż możliwa jest na min praktycznie każda operacja.
compressionQuality
MAXCOMPRATIO, MAXINTEGRITY, LOWCOMP,
MEDCOMP, HIGHCOMP, lub wartości całkowite od 0 do 100.
Determinuje jakość kompresji pliku w formacie JPEG. Należy pamiętać, aby wyjście
było ustawione na JPEG.
contentFormat
Kilka przykładowych, często używanych wartości:
monochrome, 8bitlut, 8bitlutrgb, 8bitgray, 8bitgrayscale,
24bitrgb, 24bitdrctrgb, 24bitbsqrgb.
Wszytkie możliwe wartości dostępne są pod adresem WWW
z pozycji [5] literatury.
Determinuje format zawartości obrazu. Zawartość obrazu oznacza liczbę kolorów
i sposób ich reprezentacji. Wyróżniamy tu dwie główne kategorie:
1) Direct Color images (DRCT): dane o pikselach są przechowywane bezpośrednio, bez odwoływania się do dodatkowych referencji. Ta kategoria zawiera
obrazy monochromatyczne (czarno-białe), obrazy w odcieni szarości i RGB
(true color). W obrazach DRCT głębie koloru określa rozmiar danych pojedynczego piksela, np. monochromatyczne mają głębie 1-bitową, skala szaroś-
276
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Instrukcje dla autorów referatów Konferencji Naukowej BDASg
w
ci 8-bitową (lub 16-bitową dla kanału alfa), RGB 24- lub 32-bitową.
2) Lookup table images (LUT): obrazy tego typu przechowują możliwe wartości
kolorów w tablicach. Ilość kolorów dla obrazu jest zależna od rozmiaru danych piksela i numeru możliwych kolorów w tablicy. Obraz z 1 bitową tablica
LUT będzie miał 1 bitowy piksel i 2 możliwe kolory (2^1), 4-bitowy obraz
będzie miał 16 (2^4) możliwych kolorów.
Dla lepszej kontroli przy konwertowaniu obrazów do skali monochromatycznej
lepiej jest użyć operatora quantize z wartościami: ERRORDIFFUSION,
ORDEREDDITHER lub THRESHOLD.
contrast
nonnegative FLOAT (dla GRAY lub RGB),
nonnegative FLOAT FLOAT FLOAT (dla RGB),
nonnegative FLOAT FLOAT (dla GRAY lub RGB),
nonnegative FLOAT FLOAT FLOAT FLOAT FLOAT FLOAT
(dla RGB).
Dostosowuje kontrast obrazka. Można to zrobić podając wartości w procentach,
bądź przez dolną i górną granicę np.:
− contrast = <proc1> [<proc2> <proc3>]
W przypadku podania jednego parametry jest on stosowany do każdej składowej
koloru, jeśli podamy trzy to odpowiednie od RGB.
− contrast = <dol1> <gora1> [<dol2> <gora2> <dol3> <gora3>]
Przy podawaniu zakresów, wartości poniżej dolnej granicy są zmieniane na zero,
powyżej do pełnej intensywności koloru.
cut
(nonnegative INTEGER INTEGER INTEGER INTEGER)
maksymalna wartość to 2147483648
Określa obszar jaki zostanie wycięty. Pierwsze dwa parametry to wartości
bezwzględne punktu, od którego cięcie nastąpi, dwa następne określają szerokość
i wysokość: (origin.x origin.y width height);
fileFormat
BMPF, CALS, GIFF, JFIF, PBMF, PGMF, PICT, PNGF, PNMF,
PPMF, RASF, RPIX, TGAF, TIFF, WBMP
Wymusza format wyjściowy pliku.
(positive INTEGER INTEGER)
Skaluje obraz do podanych wartości w pikselach: (szerokość, wysokość), nie może
być łączony z innymi skalującymi operatorami.
Użytkownik sam musi pilnować aby proporcje zostały zachowane.
Powoduje lustrzane odbicie w pionie.
gamma
pl
s.
flip
da
.b
w
w
fixecScale
positive FLOAT
(positive FLOAT FLOAT FLOAT)
Dostosowuje wartość gamma (jasność) obrazka.
Wartości większe niż 1.0 rozjaśniają obraz, wartości od 0 do 1.0 przyciemniają.
Możemy podać gamme dla każdego koloru osobno podając trzy oddzielne wartości.
maxScale
positive INTEGER INTEGER
Skaluje obraz do podanych wartości w pikselach zachowując proporcje. Nie można
tej metody łączyć z innymi metodami skalującymi. Podawane wartości określają
maksymalny rozmiar obrazu wyjściowego, wiec faktyczny rozmiar może być
mniejszy od zadanych parametrów.
277
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
mirror
Lustrzane odbicie obrazu w poziomie.
page
nonnegative INTEGER
w
Wybiera stronę z obrazu z formatu TIFF. Pierwsza strona ma numer 0.
ERRORDIFFUSION (default), ORDEREDDITHER,
quantize
THRESHOLD <wartość>, MEDIANCUT <opcjonalna próbka>
Wartość tego atrybutu jest brana pod uwagę w przypadku, gdy zmieniamy głębie
koloru obrazu.
Do zmiany 8-bitowej skali szarości w monochromatyczny obraz, lub do redukcji 24bitowego obrazu RGB do 8-bitowego LUT używamy wartości ERRORDIFFUSION,
która jest wartością domyślną. Kwantyzer ERRORDIFFUSION zatrzymuje błędne
rezultaty z kwantyfikacji danego piksela i rozsiewa(przekazuje) je do pikseli
sąsiadujących. Kwantyfikacja ta używa stałej tabeli kolorów. Rezultat operacji jest
zadowalający dla większości obrazów, ale tworzy nieprzyjemne/niepożądane
artefakty (sztuczne wady w oglądanym obrazie). Artefakty są wynikiem zastosowania kolorów które są statystycznie rozłożone na całej przestrzeni RGB. Z tego względu obrazy zawierające dużo intensywnych odcieni kilku kolorów będą znacznie
odbiegały od oryginału.
Dla tego typu obrazów lepiej jest stosować wartość ORDEREDDITHER, która
działa trochę szybciej. Umożliwia redukcję z 24b RGB do 8b LUT oraz 8b skali
szarości do obrazu monochromatycznego. Kwantyzer ORDEREDDITHER znajduje
najbliższy odpowiednik koloru dla danego piksela w tablicy i dostosowuje rezultaty
do zminimalizowania widocznej utraty głębi. Kwantyfikacja tego typu nie jest
odpowiednia, kiedy obraz zawiera ostre przejścia kolorów.
THRESHOLD <wartość> redukuje 8 bitową skalę szarości do obrazu monochromatycznego. Kwantyzer przypisuje czarny lub biały kolor do piksela na podstawie porównania wartości odcienia szarości tego piksela do wartości podanej argumentem.
Dla odcieni większych bądź równych argumentowi kolor jest biały, w przeciwnym
przypadku czarny. Dla 256 odcieni szarości 0 oznacza kolor czarny, 255 biały.
MEDIANCUT <opcjonalny parametr> redukuje 24b RGB do 8b LUT. Ten sposób
kwantyfikacji generuje najbardziej optymalną tabelę kolorów, wybierając kolory na
podstawie częstości ich występowania w oryginalnym obrazie. Metoda ta jest dość
czasochłonna. Poza tym niektóre obrazy mogą lepiej wyglądać przy kwantyfikacji
sposobem ERRORDIFFUSION lub, ORDEREDDITHER. Opcjonalny parametr,
którego domyślna wartość jest równa 1, oznacza, że każdy jeden piksel będzie brany
pod uwagę podczas określania tablicy kolorów. Wartości n większa od jednego
oznacza, że jeden piksel na n będzie rozpatrywany.
Rotate
FLOAT
Obraca obraz w płaszczyźnie o podany kąt.
Wartości dodatnie powodują obrót zgodny ze wskazówkami zegara, wartości ujemne
w kierunku przeciwnym. Po obrocie zawartość obrazu jest transformowana do
położenia 0,0. Miejsca które pozostają ‘puste’ zostaną wypełnione kolorem czarnym.
Operacja obrotu trwa dość długo. Dla wartości: 90, 180, 270 Oracle stosuje
specjalny algorytm, który znacznie przyśpiesza wykonywaną operację.
Scale
positive FLOAT
Kolejna z komend, która powoduje przeskalowanie obrazu. Wartością jaką podajemy dla tej komendy jest stosunek obrazu nowego do oryginalnego. W echnika a
są dwie techniki skalowania obrazu. Pierwsza „skalowanie przez próbkowanie” jest
da
.b
w
w
pl
s.
278
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Instrukcje dla autorów referatów Konferencji Naukowej BDASg
w
używana tylko jeśli oczekiwana jakość kompresji jest MAXCOMPRATIO lun
HIGJCOMP, albo jeżeli obraz jest skalowany w górę w obu kierunkach. Ta technika
skalowania wybiera ech z obrazu oryginalnego, wskazywany przez algorytm i pobiera jego kolor do obrazu docelowego. Technika ta jest bardzo szybka, lecz jakość
obrazu jest średnia.
Drugi sposób „skalowanie uśredniające” jest używany w każdym innym przypadku.
echnika ta pobiera kilka sąsiadujących pikseli piksela wskazanego przez algorytm
i oblicza średni kolor piksela wyjściowego. Ta metoda jest wolniejsza, jednak jakość
obrazu jest dużo lepsza.
xScale
yScale
positive FLOAT
w
w
Skaluje obraz na osi odpowiednio X/Y. Są to jedyne komendy do skalowania, które
mogą wystąpić razem.
Istotną różnicą pomiędzy xScale, yScale a komendą scale jest fakt, iż te metody
zawsze używają algorytmu „skalowania przez próbkowanie”, niezależnie od tego
czy wyspecyfikowano jakość obrazka jako MAXCOMPRATIO lub HIGJCOMP.
3 ORDImage w przykładach
da
.b
Mając wiedzę na temat budowy i mechanizmów manipulowania danymi graficznymi
w Oracle interMedia można przedstawić kilka przykładów prezentujących wykorzystanie
wybranych funkcji.
Na początek utwórzmy alias do katalogu, w którym będą przechowywane obrazy oraz
nową tabelę do przechowywania obrazu i jego miniaturki.
CREATE OR REPLACE DIRECTORY daro_dir AS 'c:\ora_dir\daro\';
DROP TABLE obrazy;
CREATE TABLE obrazy (
obraz_id NUMBER NOT NULL PRIMARY KEY,
obraz ORDSYS.ORDImage,
obraz_min ORDSYS.ORDImage
);
pl
s.
Krok następny to wstawienie do tabeli kilku rekordów. Posłużymy się w tym celu dwoma
różnymi konstruktorami.
INSERT INTO obrazy(obraz_id, obraz, obraz_min)
VALUES (1, ORDSYS.ORDImage.init(), ORDSYS.ORDImage.init());
INSERT INTO obrazy(obraz_id, obraz, obraz_min)
VALUES (2, ORDSYS.ORDImage.init('HTTP', 'http://dzariusz.pl/',
'interMedia.bmp'), ORDSYS.ORDImage.init());
Jak można zauważyć, instancja obrazów dla miniaturek oraz obraz główny w wierszu
pierwszym zostały utworzone konstruktorami bezparametrowymi. W drugim przypadku
zastosowaliśmy konstruktor z parametrami, podając jako źródło danych adres www
(HTTP). Aby pierwszy rekord także zawierał dane multimedialne, zaimportujmy obraz
z utworzonego wcześniej katalogu.
SET SERVEROUTPUT ON;
DECLARE
obj ORDSYS.ORDImage;
ctx RAW(64) :=NULL;
BEGIN
279
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
SELECT obraz INTO obj FROM obrazy WHERE obraz_id = 1;
obj.importFrom(ctx, 'FILE', 'DARO_DIR', 'interMedia.tif');
UPDATE obrazy SET obraz = obj WHERE obraz_id=1;
COMMIT;
END;
W celu zapewnienia zgodności wartości wszystkich atrybutów, posłużymy się metodą
setProperties() dla każdego dodanego obiektu.
w
SELECT obraz INTO obj FROM obrazy WHERE obraz_id = id FOR UPDATE;
obj.setProperties();
UPDATE obrazy SET obraz = obj WHERE obraz_id = id;
w
Należy zauważyć, iż ponieważ jeden z dodanych obrazów znajduje się na serwerze WWW,
to za każdym razem Oracle pobiera obraz ze wskazanego adresu i zapisuje go pod
tymczasową zmienna BLOB i dopiero wtedy wykonuje żądane operacje.
Mając uzupełnioną tabele danymi, możemy sprawdzić atrybuty obrazów i dowiedzieć się
czy dane są poprawne:
da
.b
w
SELECT obraz INTO obj FROM obrazy WHERE obraz_id = id FOR UPDATE;
DBMS_OUTPUT.PUT_LINE('Nazwa źródła: ' || obj.getSourceName);
DBMS_OUTPUT.PUT_LINE('Źródło: ' || obj.getSource);
DBMS_OUTPUT.PUT_LINE('Szerokość: ' || obj.getWidth);
DBMS_OUTPUT.PUT_LINE('Wysokość: ' || obj.getHeight);
DBMS_OUTPUT.PUT_LINE('Typ źródła: ' || obj.getSourceType);
DBMS_OUTPUT.PUT_LINE('Lokalizacja źródła: ' || obj.getSourceLocation);
DBMS_OUTPUT.PUT_LINE('MIME: ' || obj.getMimeType);
DBMS_OUTPUT.PUT_LINE('Data modyfikacji: '
|| TO_CHAR(obj.getUpdateTime(),'MM-DD-YYYY HH24:MI:SS'));
DBMS_OUTPUT.PUT_LINE('Rozmiar danych: '
|| TO_CHAR(DBMS_LOB.GETLENGTH(obj.getContent)) || 'b');
spr := obj.checkProperties();
IF spr THEN DBMS_OUTPUT.PUT_LINE('Atrybuty są zgodne dla id=' || id);
ELSE DBMS_OUTPUT.PUT_LINE('Niezgodność atrybutów dla id=' || id);
END IF;
UPDATE obrazy SET obraz = obj WHERE obraz_id = id;
W odpowiedzi otrzymujemy:
pl
s.
Nazwa źródła: interMedia.bmp
Źródło: HTTP://http://dzariusz.pl//interMedia.bmp
Szerokość: 640
Wysokość: 450
Typ źródła: HTTP
Lokalizacja źródła: http://dzariusz.pl/
MIME: image/bmp
Data modyfikacji: 01-17-2008 18:51:02
Rozmiar danych: 0b
Atrybuty są zgodne dla id=2
Jeżeli atrybuty są zgodne należy wykonać jeszcze jedną operację aby móc przystąpić
do wykonywania modyfikacji bezpośrednio na obrazie za pomocą metod process()
i processCopy(). Mianowicie należy zaimportować dane do bazy. Obraz w wierszu
pierwszym jest już przechowywany w bazie danych, ponieważ zaraz po dodaniu krotki
wykonany został import. Pozostał więc tylko plik z rekordu drugiego, który jest
umieszczony na serwerze WWW.
SELECT obraz INTO obj FROM obrazy WHERE obraz_id = id FOR UPDATE;
obj.import(ctx);
UPDATE obrazy SET obraz = obj WHERE obraz_id = id;
280
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
Instrukcje dla autorów referatów Konferencji Naukowej BDASg
W pierwszej kolejności użyjemy funkcji skalującej, do utworzenia miniaturek obrazów
w tabeli. Oryginalne obrazy mają wymiary 640px na 450px. Tworzone miniatury będą miały maksymalny rozmiar 32x32 i zostaną zapisane do atrybutu trzeciej kolumny. Ponieważ
obraz nie będzie miał domyślnie ustawionych parametrów źródła, należy to zrobić ręcznie.
w
SELECT obraz, obraz_min INTO obj_1, obj_2 FROM obrazy
WHERE obraz_id = id FOR UPDATE;
obj_1.processCopy('maxScale=32 32', obj_2);
obj_2.setSource('FILE', '', 'min_' || obj_1.getSourceName);
UPDATE obrazy SET obraz_min = obj_2 WHERE obraz_id = id;
w
Zwróćmy uwaga że, dla plików *.tif, plik wyjściowy zawiera tylko zminimalizowaną
wersję obrazu pierwszego z kolekcji.
Kolejny blok PL/SQL eksportuje nowo utworzone obrazy do katalogu DARO_DIR,
nadając im odpowiednie nazwy.
SELECT obraz_min INTO obj FROM obrazy WHERE obraz_id = id;
obj.export(ctx,'file', 'DARO_DIR', obj.getSourceName());
da
.b
w
Zaprezentowaliśmy wszystkie podstawowe operacje na ORDImage - od importu plików
z serwera WWW, przez kopie tworzone wewnątrz bazy po eksport plików z bazy do źródła
zewnętrznego. Za podsumowanie treści rozdziału niech posłużą przedstawione poniżej
rysunki (widoki) prezentujące wynik niektórych operacji.
pl
s.
Rys. 1. Wynik zastosowania na obrazie formatu RGB 24 bitowego (true color) przetwarzania (od lewej): obj.process('contentformat=8bitlutgray compressionFormat=JPEG')
i obj.process('contentformat=monochrome quantize = THRESHOLD 50')
Rys. 2 Wynik zastosowania na obrazie formatu RGB 24 bitowego (true color) przetwarzania (od lewej): obj.process('contrast="90%" "10%" "90%"') i obj.process('rotate=45')
281
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008
Rozdział monografii: 'Bazy Danych: Rozwój metod i technologii', Kozielski S., Małysiak B., Kasprowski P., Mrozek D. (red.), WKŁ 2008
A. Barczak, D. Zacharczuk
Jak łatwo zauważyć, Oracle oferuje nie tylko moduł do zarządzania danymi multimedialnymi, ale również umożliwia wykonywanie niebanalnych przekształceń obrazu. Dzięki temu
możemy nawet pokusić się o stworzenie prostego edytora graficznego… chociażby online.
Literatura:
w
1.
2.
w
3.
Krzysztof Jankiewicz, Marek Wojciechowski: Standard SQL/MM: SQL Multimedia and
Application Packages, http://www.cs.put.poznan.pl/mwojciechowski/papers/sem04.pdf
Jim Melton, Andrew Eisenberg: SQL Multimedia and Application Packages (SQL/MM),
http://www.sigmod.org/sigmod/record/issues/0112/standards.pdf
Oracle interMedia Reference
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14297/ch_intro.htm#AIVUG1000
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14297/ap_xmlschms.htm#CIHBD
JCC
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14297/ap_processcopy.htm
4.
5.
da
.b
w
pl
s.
282
(c) Copyright by Politechnika Śląska, Instytut Informatyki, Gliwice 2008

Podobne dokumenty