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