以下本発明の実施の形態について添付図面を参照して詳細に説明する。特に、以下の実施形態では、情報処理装置上で、後述するハイブリッド型写真印刷アプリケーションを動作させ、ユーザが選択した画像に対して、様々な画像処理を適用した後に、その画像を印刷する構成について説明する。なお、その情報処理装置の代表例としては、携帯電話やスマートフォンやタブレット端末のような携帯型情報端末が含まれる。
<ハードウェア構成の説明>
図1は本発明の代表的な実施形態である情報処理装置115として、例えば、スマートフォンや携帯電話等の携帯型情報端末の構成例を説明するブロック図である。同図において、100はCPU(中央演算装置/プロセッサ)であり、以下で説明する各種処理をプログラムに従って実行する。図中のCPU100は1つであるが、複数のCPUあるいはCPUコアによって構成されていても良い。101はROMであり、CPU100により実行されるプログラムが記憶されている。102はRAMであり、CPU100によるプログラムの実行時に、各種情報を一時的に記憶するためのメモリである。なお、図1において、CPUは1つの例が示されているが、複数のCPUを用いる構成、即ち、マルチプロセッサ構成でも良い。
103はハードディスクやフラッシュメモリ等の2次記憶装置であり、ファイルや画像解析等の処理結果を保持するデータベース等のデータや、各種プログラムを記憶するための記憶媒体である。104はディスプレイであり、各種処理を実現するための操作を受け付けるためのUI(ユーザインタフェース)や、実行された処理による処理結果等の各種情報を表示する。ディスプレイ104は、タッチセンサ105を備えても良い。
情報処理装置115は、内部撮像デバイス110を備えてもよい。内部撮像デバイス110による撮像によって得られた画像データは、所定の画像処理を経た後、2次記憶装置103に保存される。また、画像データは、外部I/F(インタフェース)108を介して接続された外部撮像デバイス111から読み込むこともできる。
情報処理装置115は、外部I/F(インタフェース)109を備え、インターネット等のネットワーク113を介して通信を行うことができる。情報処理装置115は、この通信I/F109を介して、ネットワーク113に接続されたサーバ114より画像データを取得することもできる。
情報処理装置115は、加速度センサ106を備え、情報処理装置115自身の位置姿勢に関する加速度情報を取得することができる。情報処理装置115は、外部I/F107を介し、プリンタ112と接続されており、画像データ等のデータを出力することができる。プリンタ112は、ネットワーク113にも接続されており、通信I/F109経由で、画像データを送受信することができる。
外部I/F107〜109は、有線通信と無線通信の内、少なくともいずれかの通信形態を有するインタフェースであり、利用する通信形態に応じて外部デバイス(プリンタ112あるいはサーバ114)との通信を行う。有線通信には、例えば、USB、イーサネット(登録商標)等があり、無線通信には、無線LAN、NFC、Bluetooth(登録商標)、赤外線通信等がある。また、無線通信として、無線LANを利用する場合には、装置同士が直接接続する形態もあれば、無線LANルータ等の中継装置を介して接続する形態もある。また、外部I/F107〜109は、図では別々に構成されているが、一体となって構成されていても良い。
情報処理装置115の動作に必要な電源は、バッテリ117によって供給される。情報処理装置115が備える各種構成要素は、制御バス/データバス116を介して相互に接続され、CPU100は、この制御バス/データバス116を介して、各種構成要素を制御する。
尚、本実施形態では、情報処理装置115が、情報処理装置115が備える制御部(CPU100)によって実行されるプログラム等のソフトウェアの実行場所(ソフトウェア実行環境)となる。
<ソフトウェアのブロック図>
図2は情報処理装置115で動作するソフトウェア構成のブロック図である。
情報処理装置115は、スクリプト層217、ネイティブ層218、及びOS層219のプログラムを実行する。これらの各層は、CPU100がROM101あるいは2次記憶装置103に記憶されている対応するプログラムを読み出し実行することにより実現される。
スクリプト層217は、HTML5やCSS3、及びJavaScript等のウェブ標準言語を使って、テキストデータで命令セット(コンテンツの描画や画像の表示、動画の再生等)が記述されているプログラム層である。スクリプト層217では、アプリケーション実行環境上で、そのアプリケーション実行環境に存在するプロセッサ(例えば、CPU100)を用いて、テキストデータの各種命令セットを翻訳して実行することになる。その実行形態としては、実行の度に命令文を一行ずつ動的に翻訳する場合や、アプリケーションを起動したときに翻訳する場合、アプリケーションを情報処理装置115にインストールしたときに翻訳する場合等が考えられる。
以後、スクリプト層217で処理することや内容をスクリプトと呼ぶ。スクリプトの命令を情報処理装置115内で翻訳する形態の例として、ネイティブ層218やOS層219が備えるインタプリタの機能を使用することが挙げられる。尚、この実施形態においては、アプリケーションのUIの大部分が、スクリプト層217で記述されていることを想定している。
ネイティブ層218は、アプリケーション実行環境以外で予め翻訳(コンパイル)された命令セットが記述されているプログラム層である。形態としては、CもしくはC++といった高水準言語で記述されたコードが、予めアプリケーションの開発者のPCやサーバ上でコンパイルされ、CPU100が解釈可能な命令の集合体となっている。以後、ネイティブ層218で処理することや内容、後述するOS層219の機能をネイティブ層218から呼び出すことを含め、ネイティブと呼ぶこととする。尚、ネイティブ層218の別の実装系として、Javaが挙げられる。Javaは、C/C++と類似の高水準言語であり、予めアプリケーション開発時の開発環境上で中間コードに翻訳される。翻訳された中間コードは、各OSが備えるJava仮想環境上で動作する。本実施形態においては、このようなプログラム形態も、ネイティブ層218の一種に含める。
OS層219は、情報処理装置115のオペレーティングシステム(Operating System:OS)に対応する。OS層219は、ハードウェア機能の使用をアプリケーションに提供する役割及び固有の機能を有する。OS層219は、APIを備え、スクリプト層217やネイティブ層218から機能を使用することができる。
この実施形態では、スクリプト層217からネイティブ層218の呼び出しを可能にすることをバインディング、もしくはバインドと呼ぶ。各種ネイティブの機能は、APIを備え、該APIをスクリプトが呼び出すことでネイティブの機能を使用することができる。このようなバインディング機能は、通常、各種OSが標準的に備えている機能である。
尚、この実施形態では、スクリプト層217とネイティブ層218を含むアプリケーションのことをハイブリッドアプリケーションと呼ぶ。
スクリプト層217の画像取得部201は、ネイティブ層218に対し画像データの取得を依頼する。取得依頼時に、画像取得部201は、一意なIDを生成し、ネイティブ層218に送信する。このIDと、ネイティブ層218の画像読込部202で読み込まれた画像データは、対となって、ネイティブ層218のデータ保持部204に記憶される。これ以外にも、例えば、絶対パスを指定する方法や、ダイアログ表示を促す方法等が取得依頼の方法として挙げられる。
ネイティブ層218の画像読込部202は、画像データ群215から画像データを取得する。画像データ群215からの画像データの取得方法は、スクリプト層217の画像取得部201の依頼に依存する。依頼方法は、UI上に提供されているダイアログボックスから選択する、ファイルのパスから直接画像を選択する等が挙げられる。
ネイティブ層218のデータ変換部203は、ネイティブ層218のデータ(例:バイナリ形式の画像データ)をスクリプト層217で利用できる形式のデータ(例:テキスト形式(BASE64)の画像データ)に変換する。一方で、データ変換部203は、スクリプト層217から送られてきたデータ(例:テキスト形式(BASE64)の画像データ)をネイティブ層218で利用できる形式のデータ(例:バイナリ形式の画像データ)にする変換も行う。
スクリプト層217のデータ変換部207は、スクリプト層217のデータ(例:テキスト形式の処理パラメータ)をネイティブ層218で利用できる形式のデータ(例:テキスト形式(JSON形式)の処理パラメータ)に変換する。
ネイティブ層218のデータ保持部204は、画像読込部202で読み込んだ画像データ、画像処理部208で画像処理が施された画像データを保持する。保持される画像データは、例えば、RGB画像データに展開されており、すぐに画像処理が実行できる形式になっている。また、保持されている画像データは画像取得部201で生成したIDと対になっており、データ保持部204から画像データを取得する際はIDを指定すればよい。
スクリプト層217のコンテンツ描画部205は、プリントのためのコンテンツをウェブ標準言語を利用して記述する。この記述には、コンテンツ操作部210で操作されたスクリプトも反映される。コンテンツ描画部205で記述されたコンテンツのスクリプトは、OS層219のインタプリタ214で解釈され、ディスプレイ104に表示される。
スクリプト層217の画像処理制御部206は、画像処理に用いる補正パラメータと、処理対象となる画像を決定し、画像処理部208に画像処理を依頼する。補正パラメータはデータ変換部207でネイティブ層へ送信できる形式へ変換された後、処理対象となる画像のIDと共にネイティブ層へ送信される。
ネイティブ層の画像処理部208は、画像処理制御部206で指定された画像に対し画像処理を施す。その際、どのような画像処理を施すかは、画像処理制御部206で設定されたパラメータにより決定される。画像の指定については、例えば、スクリプト層から画像のパスを受け取る方法や、画像データごと受け取る方法などが考えられる。
OS層219のタッチイベント209は、ディスプレイ104のタッチに関する情報を取得する。タッチに関する情報とは、ディスプレイ104のタッチ検知、タッチされた位置情報等が挙げられる。取得したタッチに関する情報は、ネイティブ層218経由でスクリプト層217のコンテンツ操作部210に送信される。
スクリプト層217のコンテンツ操作部210は、画像を操作、例えば、画像の拡大、移動、回転などを行い、その操作を反映すべく、スクリプト命令を変更する。
スクリプト層217のプリンタ制御部211は、レンダリング部216へのレンダリング開始依頼、プリンタ検知の依頼、プリンタ設定画面の表示、プリント情報の生成と送信を制御する。プリンタ設定画面では、用紙のサイズ、用紙の種類、カラー・モノクロ等のプリンタ設定がなされる。ここで設定された項目を基に、プリンタデータ生成部212でプリンタデータが生成される。
ネイティブ層218のプリンタデータ生成部212は、プリンタ制御部211からの依頼を基に、プリンタ通信に必要なデータ、コマンドを生成する。プリンタ通信に必要なデータとは、通信プロトコルに則ったデータであり、コマンドとは、印刷やスキャン等、プリンタの動作を決定するためのデータである。よって、プリンタデータ生成部212は、プリンタの動作を決定するためのコマンドを含むプリンタデータを生成する。
さて、ネイティブ層218の外部デバイス通信部221は、プリンタなどの情報処理装置115と接続している外部デバイスとの通信を行うためのインタフェース(IF)である。ここでは、プリンタデータ生成部212から受け取ったデータを送信したり、プリンタ112からの情報を受信する。この実施形態ではOS層219の通信制御部213を介して通信するが、外部デバイス通信部221が直接、外部IF107へデータを送信してもよい。OS層219の通信制御部213が外部デバイスが用いる通信プロトコルに対応していればその機能を使えば良く、通信制御部213が外部デバイスが用いる通信プロトコルに対応していなければ外部デバイス通信部221がその通信プロトコルに従って通信する。
OS層219のインタプリタ214は、スクリプト層217で生成されたウェブ標準言語で記述された命令を解釈・実行する。例えば、画像の描画等の命令は、インタプリタ214を通して実行され、ディスプレイ104に表示される。
画像データ群215は、画像データを保持している領域である。データ保存部220は、必要に応じて、データ保持部204が保持する画像データを画像データ群215に保存させるために機能する。
レンダリング部216は、コンテンツ描画部205、画像処理制御部206、及びコンテンツ操作部210を制御して、処理対象の画像データのレンダリングを行う。このレンダリングには、例えば、スクリプト層217でプリンタ112への出力解像度で画像を生成することが含まれる。また、スクリプト層217におけるレンダリング結果、及び、スクリプト層217が生成途中の画像はディスプレイ104に表示されない。レンダリング結果は、ネイティブ層218のデータ変換部203に送信され、プリンタ112が利用できる形式の画像データに変換される。
<ユーザ操作に伴う処理>
図3はユーザ操作を含む処理を示すフローチャートである。まず、図3を用いて、S21からS28の各処理の概要を説明し、詳細は後述する。なお、本願のフローチャートの各ステップの処理は、情報処理装置115のCPU100が、ROM101あるいは2次記憶装置103に記憶されているプログラムを実行することにより実現される。また、図3に示す各ステップは、UIの1つである図12に示すアプリケーション画面1200に対するユーザ操作に従って遷移する。アプリケーション画面1200は、スクリプト層217によって生成される。アプリケーション画面1200の操作は、例えば、タッチセンサ105を介して実現される。
S21で、CPU100は、アプリケーション画面1200の写真画像選択ボタン1201に対するユーザ操作(タッチ操作入力も含む。以後も同様)を検知すると、その操作に応じて、任意の画像を選択する。画像を選択すると、CPU100は、アプリケーション画面1200の描画領域1206に選択された画像を表示する。
S22では、CPU100は、表示されている画像の輝度を調整するためのスライドバー1202に対するユーザ操作を検知すると、そのユーザ操作に応じて、画像処理時に利用する補正パラメータを設定する。そして、CPU100は、設定した補正パラメータに従って、表示されている画像に画像処理を施し、その処理内容及び処理結果を描画領域1206に表示する。
S23は、CPU100は、スタンプ追加ボタン1203に対するユーザ操作を検知すると、スタンプ一覧を表示する。スタンプ一覧に対するユーザ操作によってスタンプの選択を検知すると、CPU100は、描画領域1206に選択されたスタンプを追加・表示する。
S24で、CPU100は、アプリケーション画面1200に対するユーザ操作に応じて、スタンプを特定する。スタンプの特定とは、ディスプレイ104にユーザ操作によってタッチされた座標とスタンプの座標より、スタンプがタッチされたか否かを判断するものである。スタンプがタッチされた場合、そのスタンプは操作受付状態となる。ここでは、ユーザ操作に応じて、スタンプが操作受付状態になっているものとする。操作受付状態については後述する。
S25で、CPU100は、操作受付状態になっている表示領域内でスタンプをスワイプするユーザ操作を検知すると、そのユーザ操作に応じて、操作受付状態にあるスタンプが描画領域内を移動する。
S26で、CPU100は、プリントボタン1205に対するユーザ操作を検知すると、プリントに必要な情報を設定するための設定画面1301(図13)を表示する。プリントに必要な情報とは、例えば、図13の設定画面1301に示されるように、用紙サイズ、用紙種類、印刷品位、縁あり/なしの設定項目がある。これ以外にも、両面/片面、モノクロ・カラー等、使用するプリンタが有する機能に応じて、設定可能な設定項目が構成される。
S27で、CPU100は、設定画面1301の設定完了ボタン1302に対するユーザ操作を検知すると、描画領域1206に表示されている画像を、プリンタに出力するためのプリント解像度に変換するためのレンダリングを実行する。
S28で、CPU100は、プリンタの解像度に変換された画像を、プリンタ制御のコマンドと共にプリンタ112に送信する。以上の処理により、ユーザにより選択された画像がプリンタ112でプリントされる。
尚、図3に示す処理は一例であり、処理内容はこれに限定されず、ステップ群の処理順序もこれに限定されるものではない。また、この実施形態において、プロセッサで翻訳され実行されるための命令セットを含む第1のプログラム層をスクリプト層217、プロセッサ以外で予め翻訳された命令セットを含む第2のプログラム層をネイティブ層218と定義する。そして、これらの第1のプログラム層と第2のプログラム層とを包含するプログラムがハイブリッドアプリケーションを実現する。文字列データ(テキストデータ)を第1の形式、バイナリデータを第2の形式と定義する。なお、スクリプト層217は、テキスト形式のデータを保持することが可能であり、ネイティブ層218は、バイナリ形式のデータを保持することが可能である。
<写真画像選択とその画像処理の詳細>
次に以上のような構成の情報処理装置において実行する写真画像選択とそれに伴う画像処理に関する幾つかの実施形態について説明する。従って、これらの場合、情報処理装置115は画像処理装置として機能することになる。
[実施形態1]
ユーザが図12に示した写真画像選択ボタン1201を押下することでS21が開始する。ここで、図3のS21の写真画像選択の詳細について、図4を用いて説明する。なお、S301〜S302、S309〜S311はCPU100がスクリプト層217のプログラムを用いて実行する処理であり、S303〜S308はCPU100がネイティブ層218のプログラムを用いて実行する処理である。
S301で、CPU100は、一意なIDを生成する。このIDは、数値、文字列等、スクリプト層217からネイティブ層218へ送信できる形式であればどのような形でも良い。S302で、CPU100は、写真画像選択ボタン1201に対するユーザ操作に応じて画像選択をネイティブ層218に依頼する。S302では、S301で生成されたIDもネイティブ層218に送信される。その依頼では、バインディング機能によりスクリプト層217からネイティブ層218固有の画像選択APIを直接呼び出す。しかしながら、直接ネイティブ層固有の画像選択APIを呼び出せないのであれば、ネイティブ層218にスクリプト層217から直接呼び出せる関数を用意し、その関数内にネイティブ層固有の画像選択APIを呼び出す関数を記述しておけばよい。これは、ラッパを予め用意しておく方法である。また、そのAPIは、前記IDを、例えば、引数として渡す仕組みを備える。このようにしてネイティブ層218へIDが渡される。
S303で、CPU100は、デバイス固有の画像選択UIをディスプレイ104に表示する。表示された画像選択UIに対するユーザ操作に基づいて、任意の画像を1枚選択する。なお、この実施形態ではデバイス内の画像フォルダから画像を1枚選択しているが、本発明はそれに限定されるものではない。例えば、インターネット上の画像や、脱着可能な記憶媒体内の画像を選択しても良いし、デバイスのカメラ機能を利用しその場で画像を撮影し、これを選択しても良い。
S304で、CPU100は、選択された画像を取得する。例えば、選択した画像が画像ファイルの状態であれば、CPU100は、ファイルを開き、その内容を読み取る。
S305で、CPU100は、取得した画像をRGB空間に展開する。ここでは、RGBデータをネイティブ層218に保持しているが、これに限定されるものではない。例えば、JPEG(Joint Photography Expert Group)、PNG(Portable Network Graphics)、RGBA形式などで保持することもできる。RGBA形式とは、画像データのRGB(赤、緑、青)成分に、透明度としてAを組み合わせたものである。
S306で、CPU100は、展開したRGB画像を、スクリプト層217から取得したIDと関連付けてデータ保持部204に保持する。関連付け方法は、例えば、IDとRGB画像を有するオブジェクトを作成することで、IDによりRGB画像の特定を可能にするという方法が考えられる。この関連付け方法は、これに限らず、IDと選択された画像のアクセス先であるパスや、IDとRGB展開に応じて実行される関数やクラス等も考えられる。
S307で、CPU100は、展開したRGB画像をスクリプト層217で利用可能な形式(サポート可能な形式)の画像データに変換する。この実施形態では、変換するデータ形式をJPEG(Joint Photography Expert Group)とする。RGB画像データからJPEGデータへの変換は、OS層219に備えられたエンコーダを利用すればよい。
なお、ここでは、ディスプレイ104の表示サイズに対してあまりにも大きな画像であれば、縮小してからJPEGへ変換する。スクリプトは画像をUIの大きさ、ディスプレイの解像度に合わせて縮小処理を行うことになる。UIに対して過多な画素数の画像をスクリプトで扱うと、CPUに処理負荷が掛かり、かつ、大容量のメモリが必要となるため無駄が生じる。従って、この実施形態では、その無駄を回避するために縮小処理を実行する。縮小処理の目安としては、例えば、ディスプレイの表示サイズやUIで画像を表示する箇所のサイズを上限にし、それを越える画素数を持つ画像に対して縮小処理を行うよう制御するようにすれば良い。さて、その画像に対しては後述のように画像処理を施す場合があるかもしれない。これについても、元の画像(RGB展開した画像データ)に対して画像処理を施し、上記の縮小処理を実行後に縮小された画像をスクリプト層に引き渡す。
S308で、CPU100は、JPEG形式のデータをBASE64データに変換し、スクリプト層217へ送信する。これは、スクリプト層217では、RGB画像のデータ配列をそのまま利用できないため、ネイティブ層218において、スクリプト層217で解釈可能な形式に変換する必要があるためである。JavaScript(登録商標)では、文字列しか扱えないため、この実施形態では、文字列としてデータを表現するBASE64の形式を利用する。
ここで、BASE64とは、バイナリデータを文字列データとして扱うためのエンコード方式である。スクリプト層217ではネイティブ層218と同様、画像データを取得し、変更を加えることが可能である。しかし、ネイティブ層218はRGB配列のように、RAM102(メモリ)の連続した領域にその値を保持するのに対し、スクリプト層217では、連続した領域にデータが保持されているとは限らない。このように、スクリプト層217とネイティブ層218ではデータ保持方法が異なるため、従来、スクリプト層217から画像データを連続データとして一括してネイティブ層218へ送信することができなかった。
しかしながら、文字列データはスクリプト層217でも連続したデータとして扱われるので、CPU100は、スクリプト層217からBASE64形式でネイティブ層218へ連続したデータを送信する。この実施形態では、ネイティブ層218は画像情報の変換処理を行う。即ち、スクリプト層217から受け取った文字列情報を画像データへ変換することで、ネイティブ層218でのデータ操作を可能としている。逆に、ネイティブ層218からスクリプト層217へ画像データを送信する際は、ネイティブ層218で扱う画像データをBASE64方式を用いて文字列情報へと変換する。これにより、スクリプト層217とネイティブ層218との間で画像データの受け渡しが可能となる。
S309で、CPU100は、ネイティブ層218で変換されたBASE64データを受信するとともに、そのBASE64データを表示するための描画領域をRAM102に確保する。この実施形態では、描画領域の確保の一例としてHTMLのCanvas機能を利用し、画像の描画は、Canvasの有するContextオブジェクトのAPIを利用する。
S310で、CPU100は、補正パラメータを生成し、初期化する。ここで、補正パラメータとは、S22の画像処理の内容を決定するパラメータ群を保持するオブジェクトである。ネイティブ層でどのような画像処理が施されるかは、補正パラメータによって決定される。JavaScript(登録商標)で保持する補正パラメータの一例として、下記のような形態が考えられる。
var CorrectionParam = function(){
this.brightness = 10;
}
この補正パラメータは、CorrectionParamオブジェクトの中に、明るさ補正用にbrightnessという名前の変数が設けられており、10という値を格納するということを表している。
この実施形態では、説明の簡略化のために、補正パラメータは明るさ(輝度)補正用のみであるが、その他の補正処理用のパラメータ(ぼかしフィルタの強度、セピア変換のオン・オフ等)を追加し処理の種類を増やしても良いことは言うまでもない。
S311で、CPU100は、描画領域で描画するデータにBASE64データを指定し、それに従って、その描画領域に画像を描画する。具体的には、CPU100は、スクリプト層で指定されたBASE64データをOS層のインタプリタ214に送信する。そして、インタプリタ214がBASE64データのスクリプトを解釈し、描画領域に画像として表示する。ここで、描画領域に、BASE64データを反映させるサンプルコードの一例を示す。
--------------------------------------------------
var base64Data = ネイティブ層からのBASE64データ
var canvas = document.createElement("canvas"); //画像の描画領域確保
canvas.setAttribute("width", 100); //描画領域の大きさ設定
canvas.setAttribute("height", 100);
var context = canvas.getContext("2d"); //描画領域に描画するAPIを持つオブジェクトの生成
var img = new Image(); //Imageオブジェクトの生成
img.src = base64Data; //画像のURIを受け取ったBASE64データとする
img. //画像のロードが終わってから処理を開始する
context.drawImage(img, 0, 0, img.width, img.height, 0, 0, canvas.width,
canvas.height); //contextオブジェクトのメソッドを用いて画像を描画領域に描画
document.getElementById("div").appendChild(canvas);
//本フローチャートではCanvasが何層にもなるレイヤー構造を想定している}
これらのCanvasは至る所好き勝手に存在するわけではなく、描画、移動、拡大等の操作は、特定の領域内(図12の描画領域1206)で完結するその領域を指定しているものが「div」であり、Canvasはそのdivに追加されてゆく形態をとる。
--------------------------------------------------
この実施形態では、描画領域1206に対しCanvasが追加されてゆくレイヤー構造を用いている。Canvasは一枚の画像として扱われるため、Canvasに写真画像を描画後、スタンプなどを追加すると、スタンプも合わせて一枚の画像となる。この場合、画像内のスタンプのみに対して特定・操作を行うことは難しい。これに対して、レイヤー構造を用いてCanvasを重ねて表示すれば、ユーザには一枚の絵に見えるが、実際の描画物はそれぞれ独立しており、各々に対し個別の操作を指示することができる。なお、スタンプは、画像データに対して付加されるので付加画像と呼ぶこともある。
こうして、画像とスタンプが一枚の絵(画像)としてUI上に表示される。この実施形態では、その画像が印刷コンテンツとなる。ただし、この時点での画像はUI上に表示され、操作や確認を行うためのものである。後述するように、印刷するためには印刷に適した解像度への変換が必要となる。
<画像処理の詳細>
ユーザが図12に示したスライドバー1202を変化させることでS22が開始する。ここでは、図3のS22の画像処理の詳細について、図5を用いて説明する。なお、S401〜S403、S409、S411は、CPU100がスクリプト層217のプログラムを用いて実行する処理であり、S404〜S408、S410はCPU100がネイティブ層218のプログラムを用いて実行する処理である。
S401で、CPU100は、補正パラメータを設定する。ここでは、図3のS310で生成した補正パラメータのbrightnessの値を、スライドバー1202に対するユーザ操作に応じて設定される値が設定される。S402で、CPU100は、インジケータを起動し、ディスプレイ104に表示する。ここで、インジケータとは、ユーザに処理中である旨を伝える表示であり、一般には、プログレスバーや、時計マーク、図形の点滅や回転等の画像で表現する。S403で、CPU100は、S401にて設定された補正パラメータをネイティブ層218で利用できるJSON文字列の形式に変換する。ここで、補正パラメータはオブジェクトの形態を取っており、そのままではネイティブ層218で利用できないため、設定した補正パラメータをJSON文字列に変換する。そして、CPU100は、JSON文字列に変換された補正パラメータを、図4のS301で生成したIDと共にネイティブ層218へ転送する。
S404で、CPU100は、JSON文字列に変換された補正パラメータをデコードし、補正パラメータを取得する。より具体的には、補正パラメータをOS層219に備えられているパーサを利用してパース(解析)する。パース後に、上記の例の場合、補正パラメータ内のbrightnessが取得されることになる。
S405で、CPU100は、スクリプト層217から取得したIDを基に、図4のS305で展開されたRGB画像を特定する。尚、上述のように、IDと画像の対応付けは、IDとRGB画像と対にすることに限定されるわけではなく、例えば、IDと画像のパスを関連付ける方法を用いてもよい。その他にIDと関連付ける例として、ネイティブ層218のオブジェクト、画像データの先頭アドレス、画像を呼び出す関数等、様々なものが考えられる。
S406で、CPU100は、取得した補正パラメータから施すべき画像処理を判断し、RGB画像に対して画像処理を行う。この実施形態では、明るさ補正のパラ―メータより、全ての画素のRGBの値に10が加算される。前述の通り、補正パラメータに他の情報を追加し、画像処理の種類を増やしても良い。例えば、公知のモノクロ変換、公知のセピア色変換、「ImageFix」、「RedeyeFix」、「SmartSkin」などを追加することも可能である。
ここで、「ImageFix」とは、写真画像を、人物顔検出やシーン解析部を用いて自動で解析し、適切な明るさ・ホワイトバランス調整を行う機能(顔検出機能)である(特開2010−278708号公報参照)。また、「RedeyeFix」とは、画像中から自動で赤目画像を検出して補正する機能(赤目検出機能)である(特開2006−350557号公報参照)。また、「SmartSkin」とは、写真画像から人物の顔を検出して、該顔の肌領域を好適に加工する機能である(特開2010−010938号公報参照)。なお、画像処理機能の種類は、これに限定されるものではなく、用途や目的に応じて、様々な画像処理を利用することができる。さらに、画像処理はOS層219が提供する機能を利用してもよく、その場合であっても処理構成はこの実施形態と同じである。
S407で、CPU100は、画像処理が施されたRGB画像をスクリプト層217で利用可能な形式(サポート可能な形式)の画像データに変換する。ここでは、図3のS307と同様に、JPEG形式のデータに変換する。尚、前述のようにUIに対して画像サイズが大きい場合は、JPEGデータに変換する前に縮小処理を実行する。S408で、CPU100は、スクリプト層217にインジケータの停止を依頼する。これは、ネイティブ層218から、スクリプト層217で定義されているインジケータ停止の関数を呼び出すことで実現する。
S409で、CPU100は、インジケータを停止して、ディスプレイ104の表示からインジケータを消去する。
一方、S410で、CPU100は、変換されたJPEG形式のデータをBASE64データに変換し、スクリプト層217へ送信する。
S411で、CPU100は、ネイティブ層218で変換されたBASE64データを受信し、それに従って、図4のS309で確保した描画領域に画像を描画する。具体的には、CPU100は、スクリプト層で指定されたBASE64データをOS層のインタプリタ214に送信する。そして、インタプリタ214がBASE64データのスクリプトを解釈し、指定したUIの描画領域に画像データの描画結果を表示する。以上の処理により補正パラメータに基づく画像処理が適用された画像データが表示される。
この実施形態では、図12に示すようなスライドバー1202の変化によって画像処理が開始されるが、その開始方法はこれに限定されるものではない。例えば、画面にプラスボタン、マイナスボタンが配置されており、そのボタンを押すごとに明るさが調整されるという形態であっても良い。他にも、画像の右半分がタッチされたら明るさを増す、左半分がタッチされたら暗くするなど、タッチイベントと連動させた処理によって実現しても良い。また、ユーザ操作で補正パラメータだけ変化させておいて、画像処理の実行指示があった時に、全ての画像処理が一括して行われるという方法などを採用しても良い。
<スタンプ追加の詳細>
ユーザが、図12に示すスタンプ追加ボタン1203を押下し、ハートスタンプ1208を選択すると、S23の処理が開始する。ここでは、図3のS23のスタンプ追加の詳細について、図6を用いて説明する。以下の説明では、ユーザ操作によって、図12のアプリケーション画面1200のスタンプ追加ボタン1203が押下されてスタンプ一覧が表示された後、ハートスタンプ1208が選択された場合を例に挙げる。なお、S501〜S502、S508〜S510は、CPU100がスクリプト層217のプログラムを用いて実行する処理であり、S503〜S507はCPU100がネイティブ層218のプログラムを用いて実行する処理である。
S501で、CPU100は、一意なIDを生成する。このIDは、図3のS301で生成するIDと同等であるため、S301で説明した方法に従って生成される。S502で、CPU100は、S501で生成されたIDととともに、スタンプとして利用される画像のアクセス先(絶対パス)をネイティブ層218に送信することで、スタンプに対応するスタンプ画像の画像選択を依頼する。
S503で、CPU100は、スクリプト層217から受信したスタンプ画像の絶対パスとデバイス固有の画像選択APIを利用して、スタンプ画像を取得する。S504で、CPU100は、取得したスタンプ画像をRGB展開する。S505で、CPU100は、展開したRGB画像を、スクリプト層217から取得したIDと関連付けてデータ保持部204に保持する。その関連付け方法は、図3のS306と同様である。S506で、CPU100は、ネイティブ層218で、展開したRGB画像をスクリプト層217で利用可能な形式(サポート可能な形式)の画像データに変換する。ここでの変換は、図3のS307と同様に、JPEG形式のデータに変換する。S507で、CPU100は、JPEG形式のデータをBASE64データに変換し、スクリプト層217へ送信する。
S508で、CPU100は、ネイティブ層218で変換されたBASE64データを受信するとともに、そのBASE64データを表示するための描画領域をRAM102に確保する。S509で、CPU100は、オブジェクトパラメータを生成し、初期化する。ここで、オブジェクトパラメータとは、図3のS27のレンダリング(詳細は後述)の際、レンダリング後のスタンプの回転角度を決定するために用いられるパラメータを保持するオブジェクトである。JavaScript(登録商標)で保持するオブジェクトパラメータの一例としては、下記のような形態が考えられる。
var ObjectParam = function(){
this.theta = 0;
this.posX = 0;
this.posY = 0;
this.width = 100;
this.height = 100;
}
このオブジェクトパラメータは、ObjectParamオブジェクトの中に、回転角度を示すthetaという変数名と、thetaには0という値が格納されているということを表している。同様に、posXは描画領域(図12の1206)の左上を基準点(図12の1210)とした時のx座標、posYは描画領域の左上を基準点とした時のy座標を表わしている。また、widthは描画領域(図12の1209)の横幅、heightは描画領域の縦幅を表している。尚、この実施形態では、説明を簡単にするため、オブジェクトパラメータは必要最小限であるが、その他のパラメータ(平行移動量、拡大倍率等)を追加し、描画時やレンダリング時に利用できることは明らかである。
S510で、CPU100は、BASE64データを、生成したオブジェクトパラメータを基に、描画領域1206に画像として表示する。具体的には、CPU100は、選択されたスタンプに対応するBASE64データをOS層のインタプリタ214に送信する。そして、インタプリタ214がBASE64データのスクリプトを解釈し、描画領域にスタンプ画像として表示する。
尚、この実施形態では、説明を簡単にするために、スタンプを1つ選択した場合を例に挙げているが、複数個のスタンプを選択できることは言うまでもない。また、この実施形態では、スタンプに予め用意した画像を利用しているが、Contextオブジェクトを利用して描画物をスクリプト層で生成する方法を用いても良い。
<スタンプ特定の詳細>
ユーザが図1に示したディスプレイ104にタップすることでS24が開始する。「タップ」とは携帯型情報端末上で画面を指で押す操作のことをいい、これは、PCでのポインティングデバイスによる「クリック」に相当する操作である。ここでは、図3のS24のスタンプ特定の詳細について、図7を用いて説明する。なお、S602〜S603は、CPU100がスクリプト層217のプログラムを用いて実行する処理であり、S601はCPU100がネイティブ層218のプログラムを用いて実行する処理である。
S601で、CPU100は、ディスプレイ104上でタップされた座標を取得し、スクリプト層217に送信する。
S602で、CPU100は、ネイティブ層218から受信した座標と、図5のS509で生成したオブジェクトパラメータの情報より、図3のS23で追加したスタンプがタッチされたかどうかを判断する。追加したスタンプにおいて、オブジェクトパラメータは初期値のままである。そのため、上記のオブジェクトパラメータの一例に従えば、スタンプは、描画領域1206の基準点1210を(0,0)とし、そこからx方向に100、y方向に100の領域に描画されていることになる。これより、受信した座標の座標(x,y)の内、x座標から描画領域1206のx座標分を差し引いた値が0〜100の範囲、かつ、y座標から描画領域1206のy座標分を差し引いた値が0〜100の範囲であれば、スタンプはタッチされたと判断できる。スタンプが複数個ある場合は、より上層に表示されているスタンプから順番に判定してゆき、スタンプの特定がなされた時点で処理を終了すればよい。スタンプがタッチされたと判断された場合、そのスタンプは、図3のS25の操作受付状態となる。
以降の説明では、図3のS24において、図3のS23で追加したスタンプがタッチされたものとして説明する。
S603で、CPU100は、判断結果に応じて、スタンプを操作受付状態に設定する。ここで、操作受付状態に設定することは、スタンプ操作に対する指示がなされたとき、スタンプがそれに応じた操作が実施される状態をいう。操作受付状態のスタンプが存在しない場合は、スタンプ操作に関する指示を行っても、何の変化も生じない。この実施形態では、スタンプの回転を行うスライドバー1204のみに言及しているが、他のスタンプ操作の構成を利用してもよいことは言うまでもない。
<スタンプ操作の詳細>
スタンプが操作受付状態になった時点で図3のS25が開始する。以下、図3のS25のスタンプ操作の詳細について、図8を用いて説明する。なお、図8の各ステップは、CPU100がスクリプト層217のプログラムを用いて実行する処理である。
S701で、CPU100はスタンプが「スワイプ」されたかどうかを、タッチイベントから取得できる情報に基いて調べる。ここで、「スワイプ」されたと判断された場合、処理はS702へ進み、そうでない場合はS704へ進む。ここで、「スワイプ」とは、携帯型情報端末をタップしたのち、指を画面から離さない状態で移動させる操作のことをいい、これはPCのポンティングデバイスを用いた「ドラッグ」操作に対応する。
S702で、CPU100は、スタンプのオブジェクトパラメータのposXとposYの値を「スワイプ」によって得られたx座標とy座標に更新する。S703で、CPU100は、オブジェクトパラメータを用いて、更新されたposX、posYの値を基にして、描画領域1206内のスタンプ1209を更新された座標位置(posX,posY)へと移動させる。
S704では、スタンプ操作後、画面のタッチが維持されているかどうかをタッチイベントから取得する。ここで、タッチが解除されていると判断された場合、スタンプ操作は終了し、図3のS25の処理は終了する。これに対して、引き続きユーザによりタッチがされていると判断された場合、処理はS701に戻り、前述の処理を繰り返す。
尚、この実施形態では、スタンプの操作はスワイプイベントによる移動のみであるが、本発明はこれによって限定されるものではない。例えば、ピンチアウトによるスタンプの拡大、ロングタップ(長押し)とスワイプを組み合わせてCanvasの描画物を平行移動させるなど、タッチイベントとコンテンツ操作には多くの組み合わせが考えられる。
ここで、ピンチアウトとは、ユーザが二本の指で画面にタッチした後、二本の指の間隔を空ける操作である。一般的な携帯型情報端末において、この操作は、画像・画面の拡大などに利用される事が多い。また、先述の移動とは、描画領域1206内の移動とは異なり、描画物であるスタンプ1209がCanvas内で移動することを意味している。例えば、図12において、スタンプ1209内のハートをwidth/2だけ右に移動したとすると、スタンプ1209の左半分は何も表示されず、その右半分にはハートの左半分が入っているような状態になる。
<プリンタ設定の詳細>
ユーザが、図12に示したプリントボタン1205を押下することで図3のS26の処理が開始する。ここでは、図3のS26のプリンタ設定の詳細について、図9を用いて説明する。なおS901、S909〜S911はCPU100がスクリプト層217のプログラムを用いて実行する処理であり、S902、S904〜S905、S907、S908、S912はCPU100がネイティブ層218のプログラムを用いて実行する処理である。また、S903とS906とはプリンタ112が実行する処理である。
S901で、CPU100は、スクリプト層217からネイティブ層218へデバイス情報としてのプリンタ情報取得を依頼する。これは、プリンタ112と通信を行うためのスクリプト層217からの要求にあたる。依頼の方法は、画像選択時と同様に、バインディング機能によりスクリプトからネイティブ固有のAPIを呼び出す。ネイティブ層218には、スクリプト層217から直接呼び出せる関数もしくはその関数を間接的に呼び出す、いわゆる、ラッパが予め用意されている。例えば、GetPrinterInfoというネイティブ関数を用意しておき、スクリプト側からその関数を呼び出す。このようにして、ネイティブ層はスクリプト層からの外部デバイスとの通信の要求を取得する。
通常、スクリプト層217からはセキュリティ上の制限で外部デバイスと直接通信することはできない。そのため、上記のように、スクリプト層217から、一旦、ネイティブ層218へ外部デバイス情報の取得を依頼し、ネイティブ層218を介して外部デバイスと通信を行う。ここで、ネイティブ層218は、OS層219を介して、外部デバイス(例えば、プリンタ112)と通信する機能を備えている。
S902で、CPU100は、ネイティブ層218が該関数を呼び出されると、プリンタの検出、いわゆるディスカバリーを行う。例えば、同一無線LANルータで繋がっているプリンタを検出する。ここでは、通信可能なプリンタの検出を行うため、例えば、Bonjour(登録商標)などのプロトコルにより、ブロードキャストやマルチキャスト等の方法を用いてプリンタに対して通信を試みる。
これに対して、S903では、プリンタ112はその要求に応じて応答する。
S904では、CPU100は、応答のあったプリンタのIPアドレスを検知して記憶する。さらに、S905では、CPU100は、応答のあったプリンタのIPアドレスへプリンタ情報の提供を要求する。応答のあったプリンタが複数の場合、CPU100は、全てのプリンタに対して情報の提供を要求する。そのために、CPU100はネイティブ層で、プリンタの情報を取得するためのコマンドを生成する。そのコマンドとは、プリンタの動作を指定する命令であり、その一例としては、以下のようなXMLで表現される。
----------------------------------------------
01: <?xml version="1.0" encoding="utf-8" ?>
02: <cmd xmlns:trans="http://www.xxxx/yyyyy/">
03: <contents>
04: <operation>GetInformation</operation>
05: </contents>
06: </cmd>
----------------------------------------------
上記各行の左側に書かれている「01:」等の数値は説明を行うために付加した行番号であり、本来のXML形式のテキストには記載されない。
1行目はヘッダであり、XML形式で記述していることを表している。
2行目のcmdはコマンドの開始を意味する。xmlnsで名前空間を指定し、コマンドの解釈の定義を指定している。尚、6行目の</cmd>でコマンドの終了を示している。
3行目は以後に内容を記載する宣言であり、5行目でその終了を示している。
4行目には要求する命令が記載されており、<operation>と</operation>の間に実際の命令文言が存在する。命令文言であるGetInformationは、外部デバイスであるプリンタの情報を取得する命令である。例えば、プリンタが対応している用紙種類、サイズ、縁なし印刷機能の有無、印刷品位、等のケーパビリティ情報を提供するよう要求する。
尚、プリンタ情報取得コマンドの生成は、例えば、ROM101に予め記憶した固定のテキストを読み込んでも構わない。また、XML等のテキスト形式に限らず、バイナリ形式で記述し、それに沿ったプロトコルで通信しても良い。また、生成したプリンタ情報取得コマンドは、HTTP等のプリンタが対応している通信プロトコルに従った形式で、外部デバイス通信部221を介してプリンタ112へ送信される。
また、通信方法はこれに限定されるものではない。Wi−Fi(登録商標)ダイレクトやBluetooth(登録商標)、赤外線通信、電話回線、有線LAN、USBを用いた接続でも良く、その方法に沿ったプロトコルで通信を行えば同様の効果を得ることができる。
図9では、ネイティブ層218で、コマンドを生成する構成としているが、スクリプト層217で、コマンドを生成する構成でも、同様の効果が得られる。その場合、スクリプト層217で、例えば、上記のXML形式の命令文を含むコマンドを作成し、ネイティブ層218へ渡す。それを受けて、ネイティブ層218は、通信プロトコルに従った形式でプリンタ112へそのコマンドを送信する。
S906で、プリンタ112は、情報処理装置115からコマンドを受信すると、デバイス情報であるプリンタ情報をXML形式で通信プロトコルに沿って、情報処理装置115へ送信する。以下に、プリンタの情報の一例を示す。
----------------------------------------------
01: <?xml version="1.0" encoding="utf-8" ?>
02: <cmd xmlns:trans="http://www.xxxx/yyyyy/">
03: <contents>
04: <device id=”Printer001” />
05: <memory receive= 7680000 />
06: <mode = 1>
07: <media>GlossyPaper</media>
08: <size>A4</size>
09: <quality>1</quality>
10: <border>no</border>
11: <dpi x=1200 y=1200 />
12: </mode>
13: <mode = 2>
〜中略〜
</mode>
<mode = 3>
〜中略〜
</mode>
〜中略〜
</contents>
</cmd>
----------------------------------------------
1行目はヘッダであり、XML形式で記述していることを表している。2行目のcmdはコマンドの開始を意味する。xmlnsで名前空間を指定し、コマンドの解釈の定義を指定している。尚、最下行の</cmd>でコマンドの終了を示している。
3行目は以後に内容を記載する宣言であり、下の</contents>までその内容は継続する。4行目でデバイスIDを示している。ここでは、プリンタ112の機種名が「Printer001」であることを表している。5行目についてはこの実施形態では用いない。後の実施形態で詳細に述べる。6行目以降はプリンタ112が有する各モードについての記述である。<mode>から</mode>までで、1つのモードにおける情報が記述されている。6行目では、モードの番号が1である。以降の<media>は印刷用紙の種類、<size>は用紙サイズ、<quality>は印刷品位、<border>は縁あり/なしの情報をそれぞれ記述している。11行目の<dpi>は入力解像度を表しており、横方向が1200[dpi]、縦方向が1200[dpi]である。入力解像度についての詳細は後述する。
13行目以降は他のモードであるモード2についての情報が記述されている。このように、プリンタ112の機種名と、そのプリンタが対応している全てのモードがこのXMLに記述されている。尚、プリンタ情報の記述方法はこれに限定されることはなく、タグ形式でないテキストや、バイナリ形式等の他の形式であっても構わない。
また、上記はプリンタの印刷機能の情報を受け渡ししている例を記載しているが、本発明はこれに限定されるものではない。例えば、プリンタが処理可能な画像処理や解析処理、静かに印刷するモードの有無、メモリカードの利用有無、インク残量などのステータスなどの情報を受け渡ししても良い。画像処理の例としては、モノクロやセピア、彩度強調などの色変換、複数画像のレイアウト、ホワイトバランス補正、ノイズ除去、その他自動で写真を好ましい色や輝度に補正する処理などが挙げられる。
そして、S907では、CPU100は、プリンタからプリンタ情報を取得する。CPU100は、ネイティブ層で、受信したプリンタ情報から、例えば、プリンタ112が有する全てのモードにおける印刷用紙の種類、サイズ、印刷品位、縁あり/なしの項目と項目数等を取得する。
S908では、CPU100は、受信したプリンタ情報をスクリプト層217が解釈可能な形式に変換して、スクリプト層217へ送信する。つまり、CPU100は、プリンタ112との通信によって得られた情報をスクリプト層217へ渡す。具体的には、ネイティブ関数を設けておき、バインディング機能を用いる。また、受け取ったXML形式のプリンタ情報で送信したり、タグなしのテキスト形式に変えて送信する等の方法を用いても良い。加えて、スクリプト層217から特定のネイティブ関数を呼び出す毎に、その戻り値として情報を取得しても良い。また、ネイティブ関数に取得するモードなどの引数を渡し、その戻り値として情報を得ても良い。さらに、上述のJSON文字列を用いた受け渡しや、データ変換部207及び203を用いてBASE64等の文字列で受け渡しを行ってもよい。
S909で、CPU100は、ネイティブ層218から受信したプリンタ情報に基づいて、プリンタ112で利用できる機能を含む設定画面(図13)を形成し、表示する。これは、表示制御とも呼ばれる。ここで、接続可能なプリンタが複数ある場合はプリンタ名を表示し、設定画面1301を表示する前にユーザに印刷するプリンタを選択させるための表示画面を生成する。そして、CPU100は、選択されたプリンタに対応するプリンタ情報を用いて、選択されたプリンタの設定画面を表示する。尚、プリンタの選択は、上記に限らず、一番早く応答してきたプリンタや、より機能が多いプリンタ、印刷ジョブが混雑していないプリンタを選択する、等の方法も考えられる。
このように、CPU100は、印刷用紙の種類・サイズ、印刷品位、縁あり/なし等のプリンタで利用できる機能を選択させる設定画面1301(図13)を表示する。設定画面の形成方法の一例として、以下に、HTML記述のサンプルを示す。
------------------------------------------------
<!DOCTYPE html>
<head>
<title>印刷設定 </title>
<script>
<!-- 用紙サイズ -->
var PaperSizeNum = GetPaperSizeNum();
var p = document.getElementById("PaperList");
var i;
for(i=0; i<PaperSizeNum; i++){
p.options[i] = new Option(GetPaperSizeT(i), GetPaperSizeV(i));
}
<!-- 用紙種類-->
var MediaTypeNum = GetMediaTypeNum();
var m = document.getElementById("MediaList");
var j;
for(j=0; j<MediaTypeNum; j++){
m.options[i] = new Option(GetMediaTypeT(j), GetMediaTypeV(j));
}
<!-- 印刷品位 -->
var QualityNum = GetQualityNum();
var q = document.getElementById("QualityList");
var k;
for(k=0; k< QualityNum; k++){
q.options[i] = new Option(GetQualityT(k), GetQualityV(k));
}
<!-- 縁あり/なし-->
var BorderNum = GetBorderNum();
var b = document.getElementById("BorderList");
var l;
for(l=0; l<BorderNum; l++){
b.options[i] = new Option(GetBorderT(l), GetBorderV(l));
}
<!-- 印刷関数-->
function printer() {
SetPrint(document.getElementById("PaperList").value,
document.getElementById("MediaList").value,
document.getElementById("QualityList").value,
document.getElementById("BorderList").value);
}
</script>
</head>
<!-- 表示部 -->
<body>
用紙サイズ <select id="PaperList"></select><br />
用紙種類 <select id="MediaList"></select><br />
印刷品位 <select id="QualityList"></select><br />
縁あり/なし <select id="BorderList"></select><br />
<br />
<button id="btn1" >
</body>
</html>
------------------------------------------------
上記のGetPaperSizeNum( )、GetMediaTypeNum( )、GetQualityNum( )、GetBorderNum( )はネイティブ関数であり、それぞれの項目数を取得する機能を備える。例えば、プリンタが対応している用紙サイズがA4、A5、B5、L判の4種類である場合、GetPaperSizeNum( )は4を返す。
GetPaperSizeT(n)、GetMediaTypeT(n)、GetQualityT(n)、GetBorderT(n)もネイティブ関数であり、引数nの値番目の文字列を返す。例えば、用紙サイズのテキストを返す関数のGetPaperSize(0)の返り値は「A4」、GetPaperSize(1)の返り値は「A5」となる。これらの値は、プリンタから受信するプリンタ情報からネイティブ関数が取り出す。
GetPaperSizeV(n)、GetMediaTypeV(n)、GetQualityV(n)、GetBorderV(n)もネイティブ関数であり、引数nの値番目の文字列を返す。例えば、用紙種類のテキストを返す関数のGetMediaTypeT(n)の返り値は「光沢紙」のように、表示してユーザに示す文言である。これに対して、GetMediaTypeV(0)の返り値は「GlossyPaper」とプリンタが解釈可能な表現となっている。
これらの文言や表現は、プリンタから送られてきた情報と結び付けてネイティブが決定する。例えば、プリンタから送られてきた情報より取り出した値が「GlossyPaper」であった場合、表示するテキストは「光沢紙」と決定する。決定の方法として、ネイティブはこれらの対応表を予め保持しておき、その対応表に沿ってテキストを決定すれば良い。
尚、上記では、例として、用紙サイズ、用紙種類、印刷品位、縁あり/なしの設定を行う仕様であるが、これに限定されるものではない。他の例として、両面/片面、カラー/モノクロ、画像補正のオン/オフ等の他の設定項目が挙げられることは言うまでもない。また、前述のように印刷機能のみではなく、プリンタが処理可能な画像処理や解析処理、静かに印刷するモードの有無、メモリカードの利用有無、インク残量などのステータスなどの情報を表示しても良い。
S910で、CPU100は、設定画面1301に対するユーザ操作に基づいて、プリンタに設定する機能を選択する。上記の例で示したHTMLを、レンダリング部216を用いてディスプレイ104に表示した例が図13に示す1301である。ネイティブ層218を介してプリンタ情報を要求し、プリンタ情報から上記のネイティブ関数を用いて取得した情報を基に設定画面1301が形成されている。尚、上記HTMLはスクリプト層217、ネイティブ層218のいずれで形成しても良い。
また、図13に示す用紙サイズ等の設定項目はそれぞれプルダウンメニューになっており、ユーザ操作によって項目を選択する事ができる。ここで、設定画面1301は、プルダウンメニューによって、用紙サイズの設定項目として選択可能な項目の一覧が表示されている状態を示しており、ユーザ操作によってA4やA5等の用紙サイズを選択することができる。
S911で、CPU100は、設定完了ボタン1302に対するユーザ操作を検知すると、ユーザ操作によって選択された設定項目を含む設定情報を作成して、ネイティブ層218へ送信する。上記HTML記述の例にあるSetPrint( )もバインディング機能を有するネイティブ関数である。上記の例では、SetPrint( )を用いて、用紙サイズ、用紙種類、印刷品位、縁あり/なしの設定を文字列としてネイティブ層218へ渡している。
S912で、CPU100は、バインディング機能によりスクリプト層217から設定情報を受信する。ネイティブ層218では、後に、受信した設定情報、印刷対象の画像データ、さらにはスタンプの画像データとを基に、プリンタ112の通信プロトコルに従って、プリントコマンドを生成する。そして、プリンタコマンドは、通信制御部213を介してプリンタ112へ送信されることになる。
<レンダリングの詳細>
ユーザが、図13に示した設定画面1301の設定完了ボタン1302を押下することで図3のS27のレンダリング処理が開始する。ここでは、図3のS27のレンダリングの詳細について、図10を用いて説明する。
この実施形態のレンダリングは、UIに表示しているコンテンツをプリント用の画像サイズ(画素数)に変換する事である。コンテンツとは、上述した写真画像とスタンプを配置した画像である。通常、UIに表示される画像の画素数よりも印刷で用いられる画像の画素数の方が多いため、印刷には画像の拡大処理が必要となる。ここでは、UIに表示されたコンテンツを同じ構図でより大きな画像(画素数)になるように描画する事で、拡大処理を行う。この実施形態では、バンドレンダリング(分割拡大)の処理を主にスクリプト層で実行する。
なお、図10において、S1001、S1003、S1004、S1007は、CPU100がスクリプト層217のプログラムを用いて実行する処理である。S1002、S1005、S1008は、CPU100がOS層219のプログラムを用いて実行する処理である。S1006は、CPU100がスクリプト層217とネイティブ層218のプログラムを用いて実行する処理である。
S1001で、CPU100は、インジケータの起動をOS層219に依頼する。S1002で、CPU100は、依頼によって起動したインジケータをディスプレイ104に表示する。これにより、ユーザは処理が実行中であることを知ることができる。
S1003で、CPU100は、S911で確定した設定情報で設定されている用紙サイズに対応する出力サイズを決定する。出力サイズとは画像の画素数の事であり、この実施形態で出力サイズは、上記の設定で指定された印刷モードでの入力解像度と用紙サイズより算出する。入力解像度とは、プリンタ112の印刷モード毎に定められており、その入力解像度の画素数で画像処理や量子化処理が行われる。その入力解像度以外の画像データがプリンタ112へ転送された場合、プリンタでその入力解像度になるように拡大・縮小(変倍)が行われる。
ここでは、入力解像度が1200dpi、用紙サイズがA4であるとして出力サイズの算出方法の例を後述する。なお、「入力画素数[pixel]」が出力サイズにあたり、入力解像度はプリンタで設定されている印刷モードによって異なる場合がある。印刷モードとは用紙種類や品位などによって設けられた設定である。他の例として、出力サイズは用紙サイズ毎に予め定めておいても良いし、予め定めた解像度から算出しても良い。例えば、入力解像度を300dpiなどに設定しておき、用紙サイズを用いて算出しても良い。
なお、プリンタの印刷モードでの入力解像度以下の画像データをプリンタへ転送して印刷する場合は、プリンタ内で印刷モードの入力解像度へと拡大処理が実行される。しかし、公知の単純なロジックを用いて拡大処理を実行する場合、印刷画像にスタンプなどのオブジェクトの線や写真画像にボケやジャギーが発生し、人の目には画像品質が劣化したように見えてしまう。これとは反対に、プリンタの印刷モードの入力解像度以上の画像データが転送されたとしても、その画像データはプリンタ内で入力解像度に縮小されてしまう。
従って、上記のように出力サイズをプリンタの印刷モードでの入力解像度と用紙サイズより決定することが、処理効率が良く、結果として得られる画像の画質も良い。
S1004では、出力画像の描画領域のサイズを算出する。
ここで、出力画像の描画領域とは一枚のCanvasであり、出力サイズのCanvasに対して、先述した個々のCanvasを、サイズと領域内の相対位置が合うようにレンダリングしてゆく。
この実施形態において、出力画像の描画領域のサイズは、アプリケーションが動作している情報処理装置の状況により算出される。これは、その情報処理装置でのメモリ不足を回避するためである。例えば、入力解像度が1200dpiのプリンタで用紙サイズがA4の印刷を行う場合、メモリに1.25[GB]の容量が必要となる。そのメモリ容量の算出方法を以下に示す。
------------------------------
サイズA4:縦210[mm]×横297[mm]
縦画素数[pixel]
=210[mm]÷25.4[mm/inch] ×1200[dpi]
横画素数[pixel]
=297[mm]÷25.4[mm/inch] ×1200[dpi]
入力画素数[pixel]
=縦画素数[pixel]×横画素数[pixel]
必要メモリ容量[Byte]
=入力画素数[pixel]×3[channel]×8[ビット]
≒417.6[MB](バイナリデータの場合)
ここで、3[channelとは、画像データの各画素がRGBの3成分で表現されることを示している。画像データの各画素がYMCKの4成分で表現されるなら、4[channel]となる。また、8[ビット]とは、各画素各色成分が0〜255の値をとる8ビットで表現されることを示している。
ここで、8ビットの値(0〜255)をすべて3桁の文字列で扱うとすると、必要メモリ容量(文字データ)は417.6[MB]×3[文字]≒ 1.25[GB]となる。
------------------------------
出力画像の描画領域のサイズの決定方法として、例えば、メモリ確保を試みて、確保できなければ確保する量を減らして再度試み、確保できるまでそれを続けるなどの方法がある。そのメモリ確保はCanvasのsetAttributeで横幅(x方向)と高さ(y方向)を設定し、getContextで領域確保を行うことでなされる。ここで、横幅はプリンタに出力する全体画像の横幅で固定し、縦幅(高さ)を減らしながら上記のメモリ確保の試みを行う。こうする事で、図14に例示するように出力する全体画像を帯状(バンド)に分ける事が可能である。
なお、この実施形態では横幅を固定し、高さ方向に帯状に分割する形にしたが、本発明はこれによって限定されるものではない。例えば、正方形や横方向に分割を行っても良い。ただし、プリンタでの印刷は画像の上部から下部に向かって順になされるのが一般的である。従って、プリンタに入力する画像データもこの印刷順序に対応して横に分割した帯状にすることが望ましい。このようにして、後述する分割拡大の処理が進む毎に、プリンタに画像データの分割送信が可能となり、印刷終了までの時間を短縮するという工夫も可能である。以上の処理から、帯状(バンド)に分割してレンダリング(プリンタの入力解像度に合わせて画像データを拡大処理して描画すること)を行うことをバンドレンダリングと呼ぶ。
なお、出力画像の描画領域のサイズの決定方法は上記に限らず、例えば、確実にメモリ不足が生じないと予想される値に予め定めておいても良いし、レンダリングで印刷に遅延が起きない容量に決定するなどしても良い。
この実施形態では上記のように出力画像の描画領域のサイズを決定する事により、スクリプト層におけるメモリ不足の発生を防いでいる。
S1005で、CPU100は、算出した出力画像の描画領域をRAM102に確保する。
S1006で、CPU100は、バンドレンダリングを行う。なお、実際のレンダリング処理は、スクリプト層からの指示を受けてOS層219のインタプリタが実行するが、ここでは、スクリプトがOSの機能を利用する事もスクリプト層での実行として表している。その際、写真画像がS1005で確保した出力画像の描画領域に描画されるようにする。S1006で、CPU100は、写真画像の描画の依頼のスクリプトを解釈し、写真画像をレンダリングする。画像の描画はOS層219で行われ、CanvasのContextオブジェクトのdrawImageメソッドを利用する。なお、ここでいう描画とは、出力画像の描画領域として確保したメモリ空間へ画像データとして出力することをいい、ディスプレイ104上に画像を表示することではない。この実施形態ではS1006でバンドレンダリングの手法を用い、分割して画像を描画する。以下、その詳細について説明する。
図14は描画領域に出力される画像とバンドレンダリングとの関係を模式的に示す図である。
図14において、1401はUI上に表示されたCanvasの画像、1402、1404はユーザの指示により配置されたスタンプ、1403はユーザが選択した写真画像である。尚、拡大に用いる写真画像はUI表示されているものではなく、画像ファイルをオープンして原画像を読取ったものを用いる。上述のように、UI用の表示には縮小処理が施されたものを使っている場合がある。縮小画像は原画像の情報を失っており、これを拡大しても失われた情報は元に戻らないからである。そのため、拡大対象の画像として、UI用の画像ではなく、ファイルから読み取られた画像サイズのものが使用される。尚、上述で補正等の画像処理を施した場合、画像ファイルをオープンして読み取った画像に対して該画像処理を施したものを拡大対象とする。ここでは、図4のS304で取得し、S305でRGB展開した画像をネイティブ層218から受け取り、スクリプト層217がその画像に拡大処理を行う。
スタンプなどの画像はベクタデータとして保持しているものがある。ベクタデータは描画する際に画像として作成されるデータであるため、例えば、Canvasで拡大後に描画する場合にはその画質が劣化しない。ただし、一度ビットマップデータとして描画されたものやベクタデータでない画像データのスタンプは写真画像と同様である。この場合、上記の写真画像と同様、UI表示されているものではなく、なるべく解像度が高いソースを用いる。
この実施形態ではCanvasの画像1401をプリンタ112が求める入力解像度(画素数)へ拡大する。拡大前のCanvasの画像1401は画像1405と同じサイズであり、横幅がWb[pixel]、高さ(縦長)Hb[pixel]である。1406は拡大後の画像であり、横幅We[pixel]、高さ(縦長)He[pixel]である。また、1407、1410、1413は同サイズの出力画像の描画領域であり、横幅We[pixel]、高さ(縦長)Hp[pixel]である。
上述のように拡大後の画像の画素数は多くなるため、メモリ不足が生じやすい。そのため、図14に示す例では、3つに分割して拡大後の画像データを保持、あるいは外部デバイス(例えば、プリンタ)へ送信する。つまり、ここでは、拡大処理後の画像データの容量に対して1/3の容量であれば格納可能なメモリを出力画像の描画領域として確保できた例を説明する。なお、この実施形態では簡潔に説明するために、拡大画像を3つに分割しているが、本発明はこれによって限定されるものではなく、実際は実行環境のメモリの状態によって出力画像の描画領域と分割数を定めれば良い。
次に、分割拡大の一例としてのバンドレンダリングの処理についてフローチャートを参照して説明する。
図15はバンドレンダリング処理の詳細を示す図である。なお、図15において、S1501〜S1506、S1508はCPU100がスクリプト層217のプログラムを実行する処理であり、S1507はCPU100がネイティブ層218のプログラムを実行する処理である。
まず、S1501では分割数を算出する。分割数は以下の式に従って決定する。即ち、
分割数 =He[pixel]/Hp[pixel]
である。ただし、小数点以下は切り上げる。ここで、HpはS1004で算出された出力画像領域の高さである。
S1502では拡大率を決定する。
拡大率はUI表示されたCanvasのサイズ(画像1401、1405)に対する画像1406の比であり、以下のようになる。即ち、
ScaleW(横倍率)=We/Wb
ScaleH(縦倍率)=He/Hb
である。
S1503では、変数iに“0”を代入し、分割数だけループ処理を実行する。
次に、S1504では、画像1401に含まれるスタンプ1402、1404と写真画像1403の移動量を設定する。その移動は上方への平行移動であり、その移動距離はHbp×iである。ここで、初回はi=0のため、移動は行われない。移動の詳細な説明は後述する。
S1505では拡大率を設定する。この実施形態での拡大率の設定は、Canvasのscale( )メソッドを使用し、次のように設定する。
scale(ScaleW,ScaleH);
そして、S1506で出力画像の描画領域の出力を行う。
この実施形態ではCanvasのdrawImage( )メソッドにより、出力画像の描画領域へ画像データを出力する。その際、画像1406の全体は出力画像の描画領域1407には入りきらない。そのため、drawImage( )は画像1406の上端から出力画像の描画領域へ画像データを出力していき、出力画像の描画領域の下端へ到ると出力を終了する。よって、出力画像の描画領域へは画像1406の点線部から上部を切り出したような画像が描画領域1407に出力される。
S1507で、出力画像の描画領域の画像データをファイルへ出力する。この場合、スクリプト層217はネイティブ層218を介してファイルへ出力する。この出力形態は、この実施形態ではRGBビットマップ形式とする。そのファイルの保存場所は2次記憶装置103なので、容量に関してメモリ(RAM102)への直接的な影響がない。そのため、メモリ(RAM)の不足に関する問題は生じない。
ここではバインディング機能によりスクリプト層からネイティブ層の関数を呼び出す。この際、保存する画像データの縦、横の画素数も引数として渡す。ネイティブ層は渡された縦×横の画素数分の画像データをファイルに保存する。前述のようにスクリプト層では文字列で数値を保持しているため、ネイティブ層にてバイナリデータに変換してからファイルへ保存を行う。
なお、以上の例では2次記憶装置103へファイルとして画像データを保存したが、本発明はこれによって限定されるものではない。例えば、メモリカードや外部の記憶装置、サーバ、インターネットを介したクラウドシステムへ保存しても良い。加えて、OSの制約でスクリプト層217ではメモリに大きな容量を確保することはできないが、ネイティブ層218では大きな容量のメモリを扱えることがある。その際は、ネイティブ層218で管理するメモリ(RAM)に分割拡大した画像データを保持しても良い。
S1508では分割数分の処理を終えたかどうかを調べる。ここで、分割数分の処理を全て終えていないと判断された場合、iの値を“+1”インクリメントして処理はS1504へ戻り、全て終えている場合はバンドレンダリングの処理を終了する。
次に、3分割での出力中央部の拡大について説明する。ここは、2回目のループ処理(i=1)にあたる。
S1504では、画像1401に含まれるスタンプ1402、1404と写真画像1403の移動量を設定する。その移動は上方への平行移動であり、その移動距離はHbp×iである。ここでは移動にCanvasのtranslate( )メソッドを用いる。ここで、Hbpは、画像1401を3分割したときの高さである。以下の式で表す事ができる。即ち、
Hbp=Hp×Hb/He
である。
こうして平行移動の設定を行った際の仮想図が図14の1408である。その太線枠はCanvasで出力される範囲であり、この太線枠の外は出力(又は描画)されない。ここでは、図14の1408に示すように、画像1401を上方にHbpだけ平行移動する設定を行う。
そして、上述した上部の拡大と同様に、S1505ではCanvasのscale( )メソッドで拡大率を設定する。拡大の倍率は前述した上部と同じである。図14の1409はその拡大率で拡大した際の仮想図である。図14の1408のように上方にスライドし、scale( )メソッドで拡大設定した事により、拡大後の画像がHpだけ上へ平行移動している。なお、移動、拡大の順で設定を行ったが、拡大、移動の順であっても構わない。その際の移動量は、拡大後の画像に合わせた値(この例ではHp)とする。
続いて、S1506では上記と同様にCanvasのdrawImage( )メソッドにより、出力画像の描画領域へ画像データを出力する。図14の1406〜1407を参照して上述したように、図14の1409の太線枠の点線部より上部のみが出力画像の描画領域へ出力される。その出力の結果は図14の1410として示されており、これが3分割の中央部となる。
上部と同様に、出力結果はネイティブ層へ送られ、S1707ではファイルへ出力される。
最後に、3分割での出力の下部の拡大について説明する。ここはループ処理の3回目(i=2)にあたる。
S1504では、上記の中央部と同様、translate( )メソッドを用いて元のCanvasの画像1401を上方へ平行移動する設定を行う。平行移動の距離はHbp×2である。その移動量がHbp×2である理由は、上部での出力で元画像のHbpの高さ相当の画像が、中央部の出力で元画像のHbpの高さ相当の画像が、それぞれ拡大されて出力済みであるためである。この平行移動の様子を仮想的に表したのが図14の1411である。
続いて、S1505では上記の中央部と同様、scale( )メソッドを用いて拡大設定を行う。その拡大の様子を仮想的に表したのが図14の1412である。
続いて、S1506では上記の中央部と同様、CanvasのdrawImage( )メソッドにより、出力画像の描画領域へ画像データを出力する。上述と同様に、図14の1412の太線枠の点線部より上方のみが出力画像の描画領域へ出力される。出力の結果は、図14の1413であり、3分割の下部となる。上部、中央部と同様にS1507でこれをファイルに出力する。
ここではちょうど3分割したときの例を示したが、その他の場合にも対応可能である。例えば、分割した最下部の画像が、出力画像の描画領域の高さ(Hp)に満たない、つまりちょうど分割できず余りがでる場合がある。その際も上記と同様に平行移動と拡大、出力を行う。この時、最下部が出力された出力画像の描画領域の下の方は画像がない状態となる。この出力結果をネイティブ層218でファイルに保存するとき、この画像がない領域を省いて保存する。
S1007で、CPU100は、インジケータの停止をOS層219へ依頼する。S1008で、CPU100は、インジケータを停止して、ディスプレイ104の表示から消去する。
<プリントの詳細>
図3のS28ではレンダリングした後の画像データを用いてプリント処理を実行する。ここでは、図3のS28のプリントの詳細について、図11を用いて説明する。なお、図11のS1101〜S1103は、CPU100がネイティブ層218のプログラムを用いて実行し、S1104はプリンタ側で実行される処理である。
S1101で、CPU100は、図10のS1006のバンドレンダリングにより分割拡大し、ファイルとして保存した各バンドのRGB画像をプリンタ112で利用可能な形式に変換する。プリンタが利用可能な形式は、RGBやJPEG、CMYKに加え、PDF等のプリンタベンダーの独自フォーマット等もある。ここではそれらのうち、どのような形式であっても構わない。
S1102で、CPU100は、前記設定情報とS1101で変換された画像データを基に、プリンタ112へ送信するコマンドを生成する。そのコマンドには画像フォーマット、個々の画像の画素数(図14のWe,Hp)、画像データを含む。プリンタ112へ送る先頭のコマンドには画像全体の画素数(図14のWe,He)を含む。S1103で、CPU100は、プリンタの利用できる通信プロトコルに則り、S1102で生成した複数のバンドのコマンドを、ユーザにより選択されたプリンタ112に対し順次送信する。以上の処理により、複数のバンドのコマンド(複数の画像データ)を用いた出力処理が実現される。
プリンタ112は、コマンドとして送られる画像をプリンタ112内のメモリに蓄積する。プリンタ112は全ての画像が揃うまで待機する。全ての画像が揃うと、プリンタ112はそれらの画像を結合し、出力する1枚の画像にする。なお、各バンドのRGB画像のファイルを用いて1つの画像データを生成した後、その画像データをプリンタで利用可能な形式に変換しても良い。ただし、ネイティブ層でその処理を行うだけのメモリを使用可能な場合に限る。
S1104で、プリンタ112は、上記結合した画像の印刷を実行する。
なお、上記の例ではプリンタ112は全ての画像が揃うまでプリント動作を待機したが、逐次、分割された画像を受信する毎に印刷しても良い。印刷しながらコマンドとして送られる次の画像データを受信することにより、印刷終了までの時間を短縮することができる。また、上記の例では分割拡大した画像を一旦ファイルとして保存したが、保存せず外部デバイス(プリンタなど)へ逐次送信しても良い。こうすることで印刷終了までの時間短縮をしたり2次記憶装置へアクセスする事なく印刷することが可能になる。
従って以上説明した実施形態によれば、ハイブリッドアプリケーションにおいてスクリプト層ではメモリ不足が生じ、画像データの拡大処理が行えない環境においても、画像データの分割処理により拡大可能をとすることができる。これにより、高品位な画像をプリントすることができる。
[実施形態2]
ここでは、分割拡大(バンドレンダリング)を全てネイティブ層で行う例について説明する。この実施形態は前述の実施形態1と同じく図3のステップを実現するものであり、実施形態1と処理が重複する部分が多い。そのため、説明を簡潔にするため、実施形態1との重複部分についての説明は省略し、ここでは、この実施形態に特徴的な部分のみを説明する。
この実施形態の特徴的な部分は、図3におけるS27のレンダリングのみである。実施形態1ではレンダリングの多くをスクリプト層217とスクリプト層217から依頼されたOS層219において処理したが、この実施形態では、レンダリングをネイティブ層218が担う構成とし、高速な処理を実現している。
図16は実施形態2に従うレンダリング処理を示すフローチャートである。なお、図16において、実施形態1において図10で説明したのと同じステップには同じステップ参照番号を付し、その説明は省略する。図16において、S1001、S1003、S1004AはCPU100がスクリプト層217のプログラムを実行する処理であり、S1002とS1008はCPU100がOS層219で実行する処理である。また、S1005A、S1006A、S1006BはCPU100がネイティブ層218のプログラムを実行する処理である。
S1001〜S1003の後、S1004ではCPU100はネイティブ層218に対してレンダリング依頼を行う。この際、スタンプなどベクターデータで画像を保持しているオブジェクトについてはスクリプト層217で拡大処理を行い、描画される。描画されたスタンプなどの画像データはBASE64形式でネイティブ層218へ渡され、ネイティブ層218でこれらはバイナリデータに変換される。この際、スタンプの描画は一つずつ実行されてネイティブ層218へ渡され、ネイティブ層218でこれをバイナリデータに変換し、その後に次のスタンプの描画へ移る。このようにして、文字列データとして保持する画像を1つだけにすることができる。
上述のように画像データを文字列データで保持すると、バイナリデータと比べて、多くのメモリ容量を必要とする。そのため、以上のような処理によって使用メモリ容量を削減することができる。なお、ネイティブ層218は受け取った画像データを一旦、2次記憶装置へファイルとして保存し、使用するときにそのファイルをオープンして使用するなどしても良い。こうすることで一時的に使用するメモリ容量を削減できる。
また、ここではスクリプト層217からネイティブ層218へ各オブジェクト(写真画像やスタンプなど)の位置情報を送る。位置情報は各オブジェクトの相対的な位置とサイズ、前面背面の順序であり、UI表示されてる配置と同様のものである。その位置情報はネイティブ層218で解釈され、各オブジェクトの拡大後の位置とサイズが決定される。
S1005Aでは出力画像の描画領域の容量を算出する。これは基本的に図10のS1004と同様の処理であるが、ここでは次の制約を設ける。
外部デバイスであるプリンタ112から受信したプリンタ情報には、実施形態1で説明したように、前述したXMLの5行目に<memory receive= 7680000 />という記載がある。これは、プリンタ112が一度に受信可能な最大データ量は7680000[Byte](=7,68[MB])であることを示す。従って、出力画像の描画領域の容量は、この数値以下にする必要がある。実際には、画像データ前後にヘッダやフッタを付加してプリンタ112へ送信するため、画像領域としてはその分少ない容量となる。なお、受信可能な最大データ量に限らず、プリンタがRGBに展開して保持可能な画像のサイズをプリンタから取得し、後述の描画領域の容量を決定しても良い。
S1006Aでは、出力画像の描画領域を確保する。その描画領域はネイティブ層218が管理するメモリ領域にS1005Aで算出された容量だけ確保する。S1006Bではバンドレンダリングを実行する。その詳細は後述する。
その後の処理は、図10を参照して実施形態1で説明した通りである。
図17は実施形態2に従うバンドレンダリング処理の詳細を示すフローチャートである。このバンドレンダリングはネイティブ層218で実行され、図17を図15と比較すると分かるように、実施形態1ではスクリプト層217で実行したのと同様な処理が実施形態2ではネイティブ層218で実行されている。従って、ここでは、実施形態2に特徴的な部分のみ説明する。
S1701ではS1501と同様、分割数を算出する。この分割数は出力画像の描画領域のサイズによって定められる。そのサイズは外部デバイスであるプリンタ112から受信したプリンタ情報に含まれる値に基づいて決定しているため、分割数も外部デバイスから受信した(又は、指定された/指示された)値に基づいて定めていると言える。
S1702では拡大率と各画像位置を決定する。ここではファイルから開いた写真画像のサイズを外部デバイスへの入力のサイズへ変換する率を算出する。その算出には上述した位置情報を用いる。尚、拡大率と表現しているが、倍率が1を下回り、縮小になる場合もある。位置は、分割拡大後の位置を変数iと上記位置情報により求める。写真画像以外のスタンプの画像データの配置も前記位置情報から算出する。スタンプ画像はスクリプト層217で拡大処理がなされるので、ネイティブ層218で拡大する必要はない。
S1703はS1503と同様、分割数でのループ処理を開始する。
S1704では、決定した拡大率と位置の情報に基づいて出力画像の描画領域へ画像データを拡大しながら展開配置し、前面背面の順序に従って合成する。この際、スタンプも同様に配置、合成されるが拡大の必要はない。
S1705では、出力画像の描画領域へ出力された分割拡大画像を随時、外部デバイス(プリンタ112)へ送信する。この際、送信データのヘッダには画像データのサイズを付加する。その送信は外部デバイス通信部221を介し、外部デバイスが対応しているプロトコルに従う。プリンタ112はその分割画像を受け取ると、随時印刷を行う。ネイティブ層218では次の分割画像の送信をする際、プリンタ112へ次の分割画像の受信が可能かどうかの問い合わせを行う。プリンタ112はその問い合わせに応答して次の分割画像を受信可能か否かをネイティブ層に通知する。以上のようにして、随時分割画像の送信、受信、印刷が実行される。
S1706では分割数分のバンドレンダリングが全て終了したかをどうかを調べる。ここで、未終了であれば、処理はS1704へ戻り、全て終了であればバンドレンダリング処理を終了する。
従って以上説明した実施形態に従えば、外部デバイスが受信可能なデータ量を受信し、その量も考慮して、出力画像の描画領域サイズを算出してこれをメモリに確保するので、メモリ不足を発生させないようしつつ画像データの拡大処理を実行することができる。また、外部デバイスでのメモリオーバフローも防止することが可能となる。
また、この実施形態に従えば、ネイティブ層で拡大処理を実行するので、スクリプト層で写真画像を拡大するよりも高速に画像の拡大処理を実行でき、処理時間を短縮することができる。
なお、本願ではネイティブ層にてプリンタ用のコマンドを送信しているが、OS層で送信しても良い。
[さらに別の実施形態]
また、図1で示した情報処理装置の例は、携帯可能なモバイルコンピュータ(スマートフォンやタブレット端末)を想定したハードウェアとなっているが、本発明はそれに限定されない。例えば、据え置き型のパーソナルコンピュータ、サーバ、ゲーム機、デジタルカメラ等のハードウェア上においても、同様の構成を実現することは可能である。
加えて、上記の実施形態では外部デバイスとしてプリンタの例を説明したが、本発明はこれに制限されるものではない。例えば、外部デバイスとして、他のスマートフォンやタブレット端末、PCやサーバ、ゲーム機なども対象となる。
さらに加えて、上記実施形態では、コンテンツ(写真画像やスタンプ画像)の描画として、JavaScriptのCanvas機能で例に挙げて説明しているが、コンテンツの描画は、これに限定されるものではない。例えば、SVG(Scalable Vector Graphics)を利用して、コンテンツを描画することも可能である。
また、以上説明した実施形態では、デバイス内の画像フォルダから画像を1枚選択した例について説明したが、本発明はこれに限定されるものではない。例えば、データの絶対パスを指定する、画像の入っているフォルダごと指定する、デバイスのカメラ機能を利用しその場で画像を撮影するなどにより画像が選択されても良い。また、データの取得先についても、インターネット上の画像を選択する、脱着可能な記憶媒体内の画像を選択する、外部のデバイスと通信で画像を取得する、などが挙げられる。
加えて、上記実施形態のプリンタは、インクジェットプリンタ、レーザープリンタ、昇華型プリンタ、ドットインパクトプリンタ等を利用することができる。これらには、プリンタ機能、スキャナ機能等を有する、単一機能ではない、いわゆる、複合機(マルチファンクションプリンタ)の場合もある。
尚、以上の実施形態の機能は以下の構成によっても実現することができる。つまり、本実施形態の処理を行うためのプログラムコードをシステムあるいは装置に供給し、そのシステムあるいは装置のコンピュータ(またはCPUやMPU)がプログラムコードを実行することによっても達成される。この場合、記憶媒体から読み出されたプログラムコード自体が上述した実施形態の機能を実現することとなり、またそのプログラムコードを記憶した記憶媒体も本実施形態の機能を実現することになる。
また、本実施形態の機能を実現するためのプログラムコードを、1つのコンピュータ(CPU、MPU)で実行する場合であってもよいし、複数のコンピュータが協働することによって実行する場合であってもよい。さらに、プログラムコードをコンピュータが実行する場合であってもよいし、プログラムコードの機能を実現するための回路等のハードウェアを設けてもよい。またはプログラムコードの一部をハードウェアで実現し、残りの部分をコンピュータが実行する場合であってもよい。