約 4,841,337 件
https://w.atwiki.jp/hatan/pages/31.html
シナリオイメージ1-7 「で……なんで俺がお前の従兄妹なんだ?」 「仕方なかろう! ああする他、わらわにはなかったのだ。今はまだ家に戻るわけにはいかんのだ」 公園に取り残された俺たちは、警察の事情聴取を受けることになった。 その中で自分の身元を聞かれるやいなや出た言葉が…… 「わ、わらわは真友の従兄妹だ。二人で公園で遊んでたところを、突然襲われたのだ」 「だいたいわらわがそう答えなければ、真友だって危なかったのだぞ?」 「ん? なんでだ?」 俺にはやましいことなど一つもないのだが。 「真友の家は逆方向であろう。それにこんな時間にこんな場所で、わらわと一緒にいたと知ったらいらぬ疑いをかけられかねんぞ」 考えてなかった……。確かにそんなことになったら、今頃両親を呼び出されていたかもしれない。 「それはそれとしてだ。ここを根城にするのも難しくなったのう」 ふむ……と、腕を組みながら自分の寝床を見下ろす宮磨。そこには一つのダンボールハウスがあった。 「この寒いのに、こんなところに寝泊まりしてたのか……」 「確かに少し寒いがな。慣れればこれもなかなか乙なものだぞ?」 「いや……遠慮する」 「そうか? まあ、真友には帰る家もあるだろうし、これの世話になることはないかのう」 そうは言ってもこのまま宮磨を放っておくこともできない。退けたとはいえ、またいつあの黒い男に襲われるかわかったものではない。 「俺のアパートに……くるか?」 その言葉にきょとんとなる宮磨。そして突然笑い出した。 「ぷっ……はははっ! なんだそれは? 口説き文句のつもりか?」 「なっ、俺はお前を心配してだな……。そんなにいうならもう言わん。橋の下で暮らしてろ」 「怒ったのか? すまんすまん。あまりに似合わないことを言うものだからな。ほれ、このとおりだ」 両手を合わせ、ぺこりとおじぎをする宮磨。しかしまだその顔は笑っている。 「笑いたきゃ笑え。もう二度と言わん」 「ああっ、そんなへそを曲げるでない。ほれ、いい男が台無しだぞ。真友のことは信用しておる」 俺を無理矢理屈ませ、顔を自分のほうに向けようとする。 「わらわは本当に感謝しておるのだぞ。今日は本当に世話になりっぱなしだ。真友、ありがとう」 真っ正面からそんなことを言われては許すしかない。俺はなんだか気恥ずかしくて、そっぽを向いてしまう。 「ほら、荷物があるんだったら持つぞ。中に何が入ってるんだ?」 「おおっ、持ってくれるのか。それは助かるのう。それではこれを頼むぞ」 どしり、と俺の腕に渡される長方形の物体。稲草の臭いがするそれは…… 「た、畳? なんで畳が……」 「一畳あればどこでも寝れるといっての、生活必需品だからのう。あとはわらわが持てるから道案内を頼むぞ」 畳を抱えながら家路を急ぐ。その脇には小さな女の子。どこからどうみても怪しい奴だった。 変質者には切り刻まれ、晩飯は食い逃し、傷ついた体で畳を運ぶ。今日は散々なことばかり続く。 だがまあ、この小さな背中を守れたのなら、そんなことはどうでもいいか……。 俺たちの帰りを待っていたのは、荒れ果てた部屋だった。 「なんだ、物取りにでもあったのか?」 そうだった……あの子の存在をすっかり忘れていた。 俺たちの声を聞きつけてか、奥の部屋からぴょこりと白い髪が姿を現す。 「すまん。待っただろう? ちょっと色々あって遅くなった」 色々ありすぎて説明する気力も失せていた。散らかった部屋の片付けは明日することにしよう。 「真友、この子は誰なのだ? おぬしの妹か?」 「いや……なんて説明していいのか……」 続きマダー
https://w.atwiki.jp/hatan/pages/26.html
シナリオイメージ1-2 白い息が立ち上る。今夜も相当冷えそうだ。 通りに飾り付けられたイルミネーションが季節を物語っている。 「あと1週間か……」 クリスマスまであと1週間。同時に俺の学園の祭の日も1週間後であることを意味する。 聖夜祭と名付けられたその祭は、文字通りクリスマスを祝うものだ。 その豪勢な飾りつけはちょっとしたもので、一般の見物客も大勢訪れるほどらしい。 一緒に祝う相手もいない俺には甚だ縁のない祭ではあるが、実行委員に任命されてはしぶしぶ参加するほかない。 しかしそんな一大行事も今の俺にはどうでもいい事になってしまっていた。 あの白い女の子……一体何者なのか。 仙女のように長く白い髪。そして赤い夕日の中から生まれ出でたような、血のように赤い瞳。 浮世離れしたその風貌に、いまだに現実味を感じることができない。 「いらっしゃいませー」 コンビニ店員の元気な声が俺を迎える。 「なにはともあれ飯だな」 あれこれ考えたところで答えがでるわけもない。まずは腹の虫を治めるのが先決だろう。 『ビッグな大盛り! 納豆キムチなペペロンチーノ』 近所にコンビニはここしかないため、時間を逃すと全く何も残らないこともしばしばだ。 弁当コーナーにはすでに、この見るからに臭いそうな弁当しか残されていなかった。 というか既に納豆とキムチの臭いがあたりに漂っている。暖めたらさらにニンニクの臭いがプラスされることだろう……。 いつもなら商店街のほうまで足を伸ばすのだが、あいにく今は時間がない。 「まあ、ものは試しだよな……」 あきらめてその弁当をカゴに入れる。臭い……これは暖めないで持って帰った方がよさそうだ。 あの子にこれを食わせるわけにもいかないよな。かわりに菓子でも買おうかと悩んでいたいた時だった。 「だからのう、格好いいお兄さん。まけてくれ!」 店内にかわいらしい女の子の声がひびく。 レジのほうを見れば初詣にはまだ早いというのに、振り袖を着た小さな女の子が店員に詰め寄っていた。 背は120cmあるのだろうか。身を乗り出すたびに、ぴょこぴょことツインテールが跳ねている。 「いや、だからまけろといわれてもね……」 「これほど頼んでいるというのに、それでもおぬしは男か! この100円のパンを50円にまけるだけではないか」 そいつは無茶だろう。 「いや半額にしろっていわれてもね……子供料金じゃないんだから」 「みくびるでない! 一人の女として交渉しておるのだ。ええい、わかった60円だ。これ以上はどうにもならん!」 「いやこっちもバイトだからさ……1円もまけるわけにはね」 「ええい、まだいうか! おぬしには商売人の意地というものがないのか。客との付き合いを……」 どちらも折れることのない、不毛な戦いが繰り広げられていた。 「その子のも一緒でお願いします」 カゴをレジに置きそう告げる。このままでは俺の会計がいつになるかわからない。 「あ、ありがとうございますー」 やっと解放されると思ったのだろう。店員が油ぎった満面の笑みを浮かべる。 「なんだおぬしは? わらわは施しなぞ受けんぞ!」 やぶ蛇だった……。女の子がキッっとこちらを睨む。 「い、いや。そうだ、これはおごりだ。熱い心意気にうたれてだな」 沈黙……。 「そうか……おごりか」 「あ、ああ……」 「おごりなら仕方ないのう」 女の子がそうつぶやきながらそっぽをむく。どうやらまるく収まった……のか? 「ありがとうございましたー」 ほっとしたのか店員の声がいつもよりうれしそうだった。 続く
https://w.atwiki.jp/sany/pages/29.html
/* 2007/1/5 * c0104401 吉原美樹 * 土曜prog img_make.java * 写真(jpg)を読み込みサンプルを作成しpngファイルに出力する * * Ver.0.5 int型の引数で呼び出されるように修正 * Ver.0.8 "次へ"を設置(押すとhair_sample.pngを上書き保存) * Ver.1.0 "次へ"ボタンを破棄(画像の保存は変数で制御し * 一番最初とカラーパレットから色を選ぶ度に行う * 毎回jpgを読み込んでいたものを * 起動時に一度だけ読み込むように変更 * それに伴いアルファ値のセット・リセットを記述 * コメントを追加 * 範囲選択の部分を修正 * ドラッグ中に写真外に出た場合は写真のへりに点を取ったことにする * 変数の出力ファイル名(output_name)以外をprivate化 * Ver.1.2 コメントの追加 * アプレットでも画像を表示できるように */ import java.applet.Applet; import java.awt.AlphaComposite; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.RenderingHints; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; public class img_make extends Applet{ /** * */ // シリアル番号 private static final long serialVersionUID = 1L; // ----------------- 変数の宣言↓ここから↓ ----------------- // 顧客番号 private String name_id = "0000000000000.jpg"; // 初期値は0000000000000 private int nameid_num = 12 ; // 何桁か // 出力するファイル名(外部から操作可能) String filename = "hair_sample.png" ; // 表示 private Graphics2D g_base; private BufferedImage g_baseImage = null; // ベース(全体を一枚の絵にしてから表示する) private Graphics2D base_draw; private BufferedImage baseImage = null; // 写真の部分(ファイルに出力する) private Graphics2D pict_draw; private BufferedImage hairImage = null; private Image in_img ; // 画面のサイズ private static int win_width = 750 ; // 横 private static int win_height = 440 ; // 縦 // トリミングや空白の数値 private int pict_left = 20 ; // 写真左部の空白 private int pict_top = 20 ; // 写真上部の空白 private int pict_width = 260 ; // 写真の横 private int pict_height = 400 ; // 写真の縦 private int colorbox_size = 100 ;// カラーパレットのひとつの升目の縦と横(正方形) private int colorbox_gap = 5; // カラーパレット同士の間の空白 // カラーパレット1左部↓ private int colorbox1_left = pict_left + pict_width + 40 ; // カラーパレット2左部↓ private int colorbox2_left = colorbox1_left + colorbox_size + colorbox_gap ; // カラーパレット3左部↓ private int colorbox3_left = colorbox2_left + colorbox_size + colorbox_gap ; // カラーパレット4左部↓ private int colorbox4_left = colorbox3_left + colorbox_size + colorbox_gap ; //カラーパレット1~4上部↓ private int colorbox1_top = pict_top + 60 ; // カラーパレット5左部↓ private int colorbox5_left = colorbox1_left ; // カラーパレット6左部↓ private int colorbox6_left = colorbox5_left + colorbox_size + colorbox_gap ; // カラーパレット7左部↓ private int colorbox7_left = colorbox6_left + colorbox_size + colorbox_gap ; // カラーパレット8左部↓ private int colorbox8_left = colorbox7_left + colorbox_size + colorbox_gap ; // カラーパレット5~8上部↓ private int colorbox5_top = colorbox1_top + colorbox_size + colorbox_gap ; // マウスの座標を読み込むための変数 private double mouseX = 0 ; // x座標 private double mouseY = 0 ; // y座標 // カラーリング指定の色宣言 private String what_color = "0x000000"; // これで指定(初期値は黒) // 上の段の四色 private String color_1 = "0xFF0000"; // 赤 private String color_2 = "0x000000"; // 黒 private String color_3 = "0xFFFF00"; // 黄 private String color_4 = "0x0000FF"; // 青 // 下の段の四色 private String color_5 = "0x999999"; // 灰 private String color_6 = "0x009933"; // 緑 private String color_7 = "0x663300"; // 茶 private String color_8 = "0xFFCCCC"; // ピンク // 髪色の範囲が選択されているか否か private int hair_scope_num = 0 ; // 選択された点はいくつあるか(2未満では未選択と判定) private int hair_pointMax = 10000 ; // 点をいくつ使うか private int hairX[] = new int[hair_pointMax]; // 選択された点のx座標 private int hairY[] = new int[hair_pointMax]; // 選択された点のy座標 // 髪色の範囲を選択している最中か否か //(マウスのボタンが写真中で行われた場合にtrue、マウスのボタンが離されるとfalse) private boolean hair_scoping = false ; // 初期値は"選択中ではない" private boolean read_pict = true ; // 写真を背景に読み込むか private double point_beginX; // 選択線の始点x座標 private double point_beginY; // 選択線の始点y座標 private double point_endX; // 選択線の終点x座標 private double point_endY; // 選択線の終点y座標 // 領域選択に使う変数 private int line_count = 0; private int line_every = 3; // 何回呼び出される毎にポイントを取得するか // カラーパレットのボタンが押されたかどうか private boolean hair_coloring = false ; // 画像を保存するかどうか private boolean pict_out = false ; // 透過度を指定 private float alpha = 0.5f; // between 0.0f and 1.0f // セット private AlphaComposite alphaComposite_set = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, alpha ); // リセット(不透明に戻す) private AlphaComposite alphaComposite_reset = AlphaComposite.getInstance( AlphaComposite.SRC_OVER, 1.0f ); int width_; int height_; MediaTracker tracker; // ----------------- 変数の宣言↑ここまで↑ ----------------- public void init() { // タイマーの初期化 tracker = new MediaTracker(this); // 画面をリサイズ resize(win_width,win_height); width_=getSize().width; height_=getSize().height; setBackground(Color.decode("0xFFFFFF")); setForeground(Color.white); g_baseImage = (BufferedImage) createImage(width_,height_); g_base = (Graphics2D) g_baseImage.getGraphics(); int i,j,id, ex_num = 0 ; // int変数を文字列に変換するための準備1 String ex_str; ex_str = getParameter("id_name") ; // int変数を文字列に変換するための準備2 id = Integer.parseInt (ex_str); // 顧客番号をString型からint型に変換 // ファイル名の桁数(nameid_num)に足りない分の桁数を数える if(id == 0){ // id番号が0のときは別処理 ex_num = nameid_num ; } else{// id番号が0より大きい場合 j = id ; for(i=0;j 0;i++){// 桁数を数える j = j/10 ; ex_num = nameid_num - i; } }//else name_id = ""; // name_idを空にする for(i=0;i ex_num-1;i++){ // 足りない分だけ頭に0を詰める name_id = name_id + "0"; } name_id = name_id + ex_str; // 受け取ったid番号を後ろにつける // 一度だけhairImage_bufに写真を読み込んでおき // 書き換えるときはhairImageの上にhairImage_bufを上書きする in_img = getImage(getDocumentBase(),"data/"+name_id+".jpg"); tracker.addImage(in_img, 0); // マウスがドラッグをしているときの動きを監視 addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { // 髪色の範囲を選択中のときのみ実行する if(hair_scoping){ mouseX = e.getX(); // x座標 mouseY = e.getY(); // y座標 if(mouseX pict_left + 1){// x座標が範囲より左にあった mouseX = pict_left + 1 ; // x座標を左縁にとる } else if(mouseX pict_left + pict_width - 1){// x座標が範囲より右にあった mouseX = pict_left + pict_width - 1 ;// x座標を右縁にとる } if(mouseY pict_top + 1){// y座標が範囲より上にあった mouseY = pict_top + 1 ;// y座標を上縁にとる } else if(mouseY pict_top + pict_height - 1){// x座標が範囲より下にあった mouseY = pict_top + pict_height - 1 ;// y座標を下縁にとる } line_count++; // 範囲の選択中にこの命令が何度呼び出されたかを加算 if(line_count%line_every == 0){// 何度か呼び出されるごとに点をとる point_beginX = point_endX; // 始点のx座標(前回の終点のx座標) point_beginY = point_endY; // 始点のy座標(前回の終点のy座標) point_endX = mouseX - pict_left; // 終点のx座標 point_endY = mouseY - pict_top; // 終点のy座標 hairX[hair_scope_num] = (int)point_endX; // 選択点のx座標 hairY[hair_scope_num] = (int)point_endY; // 選択点のy座標 hair_scope_num++; // 次の選択点へ // 点が移動していた場合だけ線を描く // (始点のx座標と終点のx座標が一致しない // または、始点のy座標と終点のy座標が一致しない) if((point_beginX != point_endX)||(point_beginY != point_endY)){ repaint(); // 描画関数を呼び出す } }//if(line... }//if(hair... } }); addMouseListener(new MouseAdapter() { // マウスのボタン(左)が押された public void mousePressed(MouseEvent e){ mouseX = e.getX(); // x座標 mouseY = e.getY(); // y座標 // --- 写真の中だった場合↓ここから↓ --- if((mouseX pict_left mouseX pict_left + pict_width) (mouseY pict_top mouseY pict_top + pict_height)){ // hair_scopingをtrueにすることで // 髪色の範囲を選択中であることを示す hair_scoping = true ; // 初期化 hair_scope_num = 0;// 選択点を0に read_pict = true ; // 写真を読み込む hair_coloring = false ;// カラーパレット未選択 point_beginX = point_endX = mouseX - pict_left; // 始点x座標=終点x座標 point_beginY = point_endY = mouseY - pict_top; // 始点y座標=終点y座標 hairX[hair_scope_num] = (int)point_endX ;// 選択点のx座標 hairY[hair_scope_num] = (int)point_endY ; // 選択点のy座標 hair_scope_num++; // 次の選択点へ } // --- 写真の中だった場合↑ここまで↑ --- // --- カラーパレットの上部中だった場合↓ここから↓ --- else if(mouseY colorbox1_top mouseY colorbox1_top + colorbox_size){ // カラーパレットの1の中だった場合 if(mouseX colorbox1_left mouseX colorbox1_left + colorbox_size){ what_color = color_1 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの2の中だった場合 else if(mouseX colorbox2_left mouseX colorbox2_left + colorbox_size){ what_color = color_2 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの3の中だった場合 else if(mouseX colorbox3_left mouseX colorbox3_left + colorbox_size){ what_color = color_3 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの4の中だった場合 else if(mouseX colorbox4_left mouseX colorbox4_left + colorbox_size){ what_color = color_4 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } } // --- カラーパレットの上部中だった場合↑ここまで↑ --- // --- カラーパレットの下部中だった場合↓ここから↓ --- else if(mouseY colorbox5_top mouseY colorbox5_top + colorbox_size){ // カラーパレットの5の中だった場合 if(mouseX colorbox5_left mouseX colorbox5_left + colorbox_size){ what_color = color_5 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの6の中だった場合 else if(mouseX colorbox6_left mouseX colorbox6_left + colorbox_size){ what_color = color_6 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの7の中だった場合 else if(mouseX colorbox7_left mouseX colorbox7_left + colorbox_size){ what_color = color_7 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } // カラーパレットの8の中だった場合 else if(mouseX colorbox8_left mouseX colorbox8_left + colorbox_size){ what_color = color_8 ; read_pict = true ; // 写真を読み込む hair_coloring = true ; // カラーパレットが選択された repaint(); } } // --- カラーパレットの下部中だった場合↑ここまで↑ --- }//mousePressed() // マウスのボタン(左)が離された public void mouseReleased(MouseEvent e){ // 髪色の範囲を選択中のときのみ実行する if(hair_scoping){ point_beginX = point_endX; point_beginY = point_endY; point_endX = hairX[0]; // 選択範囲の基点を終点に(x座標) point_endY = hairY[0]; // 選択範囲の基点を終点に(y座標) repaint(); hair_scoping = false ; // 初期化(髪の範囲選択を終えた) }//if(hair... }//mouseReleased() });//addMouseListener() // baseImageは一回だけ作成される baseImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_BGR); // baseImageに手を加える宣言 base_draw = baseImage.createGraphics(); base_draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // hairImageの初期化(真っ黒) hairImage = new BufferedImage(pict_width, pict_height, BufferedImage.TYPE_INT_BGR); // hairImageに手を加える宣言 pict_draw = hairImage.createGraphics(); pict_draw.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 画面全体を白く塗りつぶす base_draw.setColor(Color.white); base_draw.fill(new Rectangle2D.Double(0, 0, win_width, win_height)); // 黒で文字を書く base_draw.setColor(Color.black); base_draw.setFont(new Font("Serif",Font.BOLD,30)); // フォントの設定 base_draw.drawString("カラーパレット",colorbox1_left,colorbox1_top-20); // カラーパレット1 base_draw.setColor(Color.decode(color_1)); base_draw.fill(new Rectangle2D.Double(colorbox1_left, colorbox1_top, colorbox_size, colorbox_size)); // カラーパレット2 base_draw.setColor(Color.decode(color_2)); base_draw.fill(new Rectangle2D.Double(colorbox2_left, colorbox1_top, colorbox_size, colorbox_size)); // カラーパレット3 base_draw.setColor(Color.decode(color_3)); base_draw.fill(new Rectangle2D.Double(colorbox3_left, colorbox1_top, colorbox_size, colorbox_size)); // カラーパレット4 base_draw.setColor(Color.decode(color_4)); base_draw.fill(new Rectangle2D.Double(colorbox4_left, colorbox1_top, colorbox_size, colorbox_size)); // カラーパレット5 base_draw.setColor(Color.decode(color_5)); base_draw.fill(new Rectangle2D.Double(colorbox5_left, colorbox5_top, colorbox_size, colorbox_size)); // カラーパレット6 base_draw.setColor(Color.decode(color_6)); base_draw.fill(new Rectangle2D.Double(colorbox6_left, colorbox5_top, colorbox_size, colorbox_size)); // カラーパレット7 base_draw.setColor(Color.decode(color_7)); base_draw.fill(new Rectangle2D.Double(colorbox7_left, colorbox5_top, colorbox_size, colorbox_size)); // カラーパレット8 base_draw.setColor(Color.decode(color_8)); base_draw.fill(new Rectangle2D.Double(colorbox8_left, colorbox5_top, colorbox_size, colorbox_size)); // 一番初めは、画像を保存する pict_out = true ; } public void start(){ try {// 画像ファイルが読み込まれるまで待つ tracker.waitForAll(); } catch (InterruptedException e) { } } public void update(Graphics g) {// 再描画 paint(g); } // ---------------- 描画関数↓ここから↓ ---------------------------- public void paint(Graphics g){ int i; g_base = (Graphics2D)g; // ------------- 写真部分の描画↓ここから↓ ---------------- if(read_pict){// 最初と再描画する場合 // hairImageにhairImage_bufを上書き pict_draw.drawImage(in_img, 0, 0, this); // 写真の読み込みをしない(選択中は線を書き加えていくだけ) read_pict = false ; } // カラーパレットのボタンが押された if(hair_coloring){ pict_draw.setComposite( alphaComposite_set );// 透過度をセット pict_draw.setColor(Color.decode(what_color));// 選択された色をセット // 範囲選択済みの場合はポリゴンを作成し塗りつぶす if(hair_scope_num 2){ // 新規オブジェクトの構築(ポリゴン) GeneralPath hair_polygon = new GeneralPath(GeneralPath.WIND_EVEN_ODD); hair_polygon.moveTo(hairX[0], hairY[0]); // 基点を移動 for(i=1;i hair_scope_num;i++){ // 点の数だけ繰り返す // 前の点から現在の点へポリゴン hair_polygon.lineTo(hairX[i],hairY[i]); } hair_polygon.closePath();// ポリゴンを閉じる pict_draw.fill(hair_polygon);// 塗りつぶす } // 範囲選択済みでない場合は写真全体を塗りつぶす else{ pict_draw.fill(new Rectangle2D.Double(0, 0, pict_width, pict_height)); } // 画像を保存する pict_out = true ; pict_draw.setComposite( alphaComposite_reset );// 透過度をリセット }//if(hair... // カラーパレットのボタンが押された以外で再描画 // (写真中でマウスのボタンが押され、髪色範囲指定の最中) else{ BasicStroke wideStroke = new BasicStroke(2.0f); pict_draw.setStroke(wideStroke); pict_draw.setPaint(Color.red); pict_draw.drawLine((int)point_beginX,(int)point_beginY,(int)point_endX,(int)point_endY); }//else // ------------- 写真部分の描画↑ここまで↑ ---------------- // 作成した写真(hairImage)をベース(baseImage)に貼り付ける base_draw.drawImage(hairImage, pict_top, pict_left, this); // ベース(baseImage)を表示する g_base.drawImage(baseImage, 0, 0, this); if(pict_out){// 作成した写真(hairImage)を保存する // 写真の保存をオフにする pict_out = false ; }//if } // ---------------- 描画関数↑ここまで↑ ---------------------------- }
https://w.atwiki.jp/fsharpmaster/pages/35.html
スキャナが出力したPDFを、出力デバイスに合わせて変換しよう この記事はF# Advent Calender 2012の11日目(10個目)の記事です。ひとつ前の記事はyukitos22さんのTypeProvider関連の丁寧な記事で、これを書き終わったら手を動かして試してみたいところです。 さて、主催者様の「実用的な」というお題を僕はそのまま字面通りとってしまい、「仕事以外に、F#で実用的なプログラムを書いたっけ・・・」などと回想した結果ひねり出したのがこのネタです。 いささか「実用」というよりは「オレ用」という感じもしなくはないのですが・・・ 僕が富士通の名作ドキュメントスキャナS1500を購入したのは、ひとえにオライリーの「プログラミング F#」や技評の「実践F#関数型プログラミング入門」を持ち歩くのが辛かったからである、と言っていいほど僕の中でF#とS1500のつながりは実は深く、S1500でスキャンしたデータをSONY Readerで持ち歩くための変換プログラムがF#で書かれたこともまた必然と言っていいと思います。 そんなわけで、このプログラムは1年前に書いたもので、今回の記事のためにチョコチョコ直しましたが色々とアレなところがある点についてはご容赦ください。 ちなみにPDFの操作は独自実装といいたいところですが、残念ながらiTextSharpを使用しています。開発環境はVS2008です。まだVS2012買ってないんですすみません。 実行にはiTextSharpが必要なため、ここからダウンロードしてください。最新の5.3.3で動作確認しています。 機能と使い方 指定したPDFファイル(S-1500が出力したもの)から、JPEGファイルを取り出して特定のディレクトリに保存する(上のテキストボックスに元PDFのパスを入れて「PDF解体」)。出力先は「c \temp」下になります。 保存したページを画面に表示し、トリミング範囲を指定する。トリミング範囲は、左のページの左上、右下をクリックしてオレンジ色の枠を動かす。ドラッグでなく2か所クリック。右のページも同じトリミングで枠が出る。ページを送って、他のページで文字が枠からはみ出ないことを確認する。 画面サイズ(右と下のテキストボックスで指定)を指定するその際、画面いっぱいになるよう画像を縮小するか、比を変えずに天地左右に空白を入れるかも指定できる。 最後にガンマ補正のパラメータを左下のスライダーで指定し、「PDF作成」ボタンで少々待てば出力先に新しいPDFが作成される。 特筆すべき部分 全ソースがここで公開されている!(UIはC#で、コアはF#で、unsafeなところはまたC#で) だからもう自分の好きなようにいじり放題。機能追加も変更も思いのまま。ただしF#erに限る。 既存の補正ソフトがどれも「帯に短し・・・」と感じられる方は是非! ソースの見どころ? このプログラムはいろんなサンプルになっていると思います。 F#からiTextSharpを呼んでJpegを取り出す iTextSharpをF#から呼んで利用するサンプルは、今のところ日本語では見当たらないようなので、ごく部分的ではありますが紹介します。 C#からdelegateをF#側に渡し、コールバックして画面の更新を行う C#からF#の関数を呼び出すこと自体には何ら難しいことはありませんが、作業の進捗を画面に表示するため、C#からクロージャを一緒に渡してそれをF#から呼びだす方法を解説します。 この際、画面の更新はUIスレッドにしかできない、というルールを回避するための方法を例示します。 複数ページの処理をマルチコアで分散して処理 PDFファイルからイメージを取り出す処理や、複数のイメージにガンマ補正をかけたりする処理は、並行に動かしても何ら差支えがありません。こういう処理をマルチコアに分散して、全体的な処理速度を上げる方法を例示してみます。 F#からC#の関数を読んでunsafeな処理(ガンマ補正)を行う F#は僕の知る限りunsafeな処理を自分ではできません。そのため、C#で作成したライブラリに処理を託します。 F#からiTextSharpを呼んでJpegを取り出す こんな流れで進んでいきます。 ファイル名をPdfReaderに与えて、PdfReaderオブジェクトを作成 let ExtractOperation (msgcb msgCallback) (endcb endCallback) (sourcePdf string) outputPath = createDirectory outputPath let pdf = new PdfReader(sourcePdf) List.iter (OnePageFrom msgcb outputPath pdf) [1..pdf.NumberOfPages] pdfオブジェクトにページ番号を与えて、ページごとのPdfDictionaryオブジェクトを取得 let OnePageFrom (msgcb msgCallback) outputPath (pdf PdfReader) (page int) = let pg = pdf.GetPageN(page) getImages outputPath pg pdf page PdfDictionaryからリソースとxobjを取得 let getImages outputPath (dict PdfDictionary) (doc PdfReader) page = let res = PdfReader.GetPdfObject(dict.Get(PdfName.RESOURCES)) ? PdfDictionary let xobj = PdfReader.GetPdfObject(res.Get(PdfName.XOBJECT)) ? PdfDictionary getPdfObjects xobj doc | Seq.iter (saveImage outputPath page) xobjからキーを列挙し、そのキーごとにxobjからPdfObjectを取り出し、そのサブタイプがPdfName.IMAGEであるものだけを列挙する。 let getImage (doc PdfReader) (theObj PdfObject) = let tg = PdfReader.GetPdfObject(theObj) ? PdfDictionary let subtype = PdfReader.GetPdfObject(tg.Get(PdfName.SUBTYPE)) ? PdfName if PdfName.IMAGE.Equals(subtype) then let xrefIdx = (theObj ? PRIndirectReference).Number let pdfObj = doc.GetPdfObject(xrefIdx) let str = pdfObj ? PdfStream let filter = tg.Get(PdfName.FILTER).ToString() match filter with | "/FlateDecode" - None | _ - Some(PdfReader.GetStreamBytesRaw(str ? PRStream)) else None let getPdfObjects (xobj PdfDictionary) (doc PdfReader) = seq { match xobj with | null - () | xobj - for key in xobj.Keys do let theObj = xobj.Get(key) if theObj.IsIndirect() then yield getImage doc theObj } 取り出すことができれば、それをbyteのストリームに見立てファイルに保存するだけです。 let parms = new System.Drawing.Imaging.EncoderParameters(1) parms.Param.[0] - new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, byte 12) let saveImage outputPath pageNumber (img byte[] option) = match img with | None - () | Some image - use memStream = new System.IO.MemoryStream(image) memStream.Position - 0L use img = System.Drawing.Image.FromStream(memStream) let path = System.IO.Path.Combine(outputPath, System.String.Format(tempFileFormat, pageNumber, 1)) match jpegEncoder with | None - () | Some enc - img.Save(path, enc, parms) 逆にF#からiTextSharpを呼んでPDFを作成し、Jpegごとにページを作って貼り込む まず、最初に用紙サイズとマージンを指定してDocumentを作成し、それとファイル名を引数にPdfWriterオブジェクトを作成してそれを開きます。 let CreatePdf outputPath aspectRatio numOfPage = let margin = 0.0f let document = new Document(new iTextSharp.text.Rectangle(0.0f, 0.0f, PageSize.A4.Width, PageSize.A4.Width * aspectRatio), margin, margin, margin, margin) PdfWriter.GetInstance(document, new System.IO.FileStream(outputPath, System.IO.FileMode.Create)) | ignore document.Open () List.iter (addOnePage document aspectRatio) [1..numOfPage] document.Close(); 次に、JpegファイルごとにImageオブジェクトを作成し、位置と大きさを設定してdocumentにAddしたのち、NewPageします。これで1ページできます。これを最後のページまで繰り返すだけです。 let addOnePage (document Document) aspectRatio pageNum = let path = System.IO.Path.Combine(effectedTempPath, System.String.Format(tempFileFormat, pageNum, 1)) let jpeg = iTextSharp.text.Image.GetInstance(path) jpeg.SetAbsolutePosition(0.0f, 0.0f) jpeg.ScaleToFit(PageSize.A4.Width, PageSize.A4.Width * aspectRatio) document.Add jpeg | ignore document.NewPage() | ignore 意外に簡単ですね。 確か海外のどっかのサイトに乗っていたC#のサンプルをF#に移植しただけではなかったかと思います。 ちょっとignoreが目立つのは、僕が手を抜いていると考えてもらっていいです。あくまで「オレ用」ですんで。 C#からdelegateをF#側に渡し、コールバックして画面の更新を行う と、ここまで書いて気が付いたのですが、この件については以前にここで書いていました。 これより細かくここで書くのはちょっと無理な気がするので、こちらを参照してください。これと同じことをこのプログラムはやっています。 具体的には、進行度をメッセージするメッセージコールバックのdelegateと、終了をメッセージするdelegateをF#の関数に渡して、それをF#の中から随時Invokeしています。 C#側のコード PDFConvertLib.ExtractImagesFromPDF( delegate(string msg){ var deleg = new MessageDelegate(ExtractImageMsg); var ret = this.BeginInvoke(deleg, new object[] {msg}); }, delegate() { var deleg = new EndDelegate(ExtractImageEndOperation); var ret = this.BeginInvoke(deleg, new object[]{}); }, filePath.Text, PDFConvertLib.outputTempPath ); F#側のコード let OnePageFrom (msgcb msgCallback) outputPath (pdf PdfReader) (page int) = let pg = pdf.GetPageN(page) getImages outputPath pg pdf page sprintf "%A %d" pdf page | msgcb.Invoke // ← ココで呼びだし! let ExtractOperation (msgcb msgCallback) (endcb endCallback) (sourcePdf string) outputPath = async { createDirectory outputPath let pdf = new PdfReader(sourcePdf) [1..numberOfThreads] | List.map (ThreadRoundRobbin (OnePageFrom msgcb outputPath pdf) pdf.NumberOfPages numberOfThreads) | Async.Parallel | Async.RunSynchronously | ignore endcb.Invoke () // ← ココで呼びだし! } let ExtractImagesFromPDF (msgcb msgCallback) (endcb endCallback) (sourcePdf string) outputPath = ExtractOperation msgcb endcb sourcePdf outputPath | Async.Start | ignore 呼び出されるコードは、asyncで囲ってAsync.Startしないと別スレッドにならないため、いくら中でコールバックしても実際の画面更新はすべてすっかり終わってからになってしまいます。 複数ページの処理をマルチコアで分散して処理 C#の方も色々機能強化されて非同期処理がだいぶ得意になっていますが、それでも記述の自由さではF#に一日の長があります。 上にも書いてあるように、PDFからイメージを取り出して保存したり、取り出した画像にエフェクトをかけたりする作業はページ単位で独立しているため、並列動作が可能です。 このプログラムは当初シリアルに処理していますが、最後になってマルチコアを有効利用するように書き換えました。それが以下の部分です。 順次処理 let ExtractOperation (msgcb msgCallback) (endcb endCallback) (sourcePdf string) outputPath = async { createDirectory outputPath let pdf = new PdfReader(sourcePdf) List.iter (OnePageFrom msgcb outputPath pdf) [1..pdf.NumberOfPages] endcb.Invoke () } 並列化 let ThreadRoundRobbin theMethod max cntThread n = async { List.iter theMethod [n..cntThread..max] } let ExtractOperation (msgcb msgCallback) (endcb endCallback) (sourcePdf string) outputPath = async { createDirectory outputPath let pdf = new PdfReader(sourcePdf) [1..numberOfThreads] | List.map (ThreadRoundRobbin (OnePageFrom msgcb outputPath pdf) pdf.NumberOfPages numberOfThreads) | Async.Parallel | Async.RunSynchronously | ignore endcb.Invoke () } ThreadRoundRobbinは、ページごとに処理を指定数のスレッドに振り分ける関数です。スレッド数が4なら、最初にスレッドにはページ1,5,9,13...が、二つ目には2,6,10.14...が、三つめには3,7,11,15...が、四つ目には4,8,12,16...が割り振られ、それがAsync.Parallelで並列に動作し、Async.RunSynchronouslyですべての処理の終了を待ってendcb.Invoke(終了通知処理)を呼び出すようになっています。 今回はこんな方法をとったのですが、何も考えずに全ページをasyncしてもページ数が少なければそれなりに動きます。ただ、あまりページが多いとエラーになるようです。 F#からC#の関数を読んでunsafeな処理(ガンマ補正)を行う C#でFastBitmapなるクラスを作り、最初にガンマ値を与えて補正テーブルを作成してから、ビットマップごとにピクセル単位でをかけています。去年どこかで見たソースそのままだったような・・・ そんなわけなのでここでは掲載しませんが、興味がある方はソースを覗いてみてください。 と思ったら、.Netの機能でガンマ補正ってかけられるんですね・・・トホホ。しかも1.1からあるみたいだし。去年何を調べたんだ。 ImageAttributes.SetGamma 終わりに という具合でざっくり説明してきましたが「全部C#でかける」とか言わないでこのF#の濃密なソースを楽しんでもらえれば幸いです。 ソースはとバイナリはこのページ最下部の添付ファイルからダウンロード(S1500PDfConverter.zip)できますが、後日Githubにもあげようと思っています。そしたらみなさんで好きなように機能拡張してください。僕も使いますので。 サポート すみません。2013年2月24日以前のソースでは「C \temp\pdfeffected」ディレクトリをプログラム内部で作っていなかったため、このディレクトリがないとPDF作成時に落ちてしまいます。最新版をダウンロードしなおすか、このディレクトリをあらかじめ作成しておいてください。m(_ _)m (文責:片山 功士 2012/12/11) 今日: - 人 昨日: - 人 トータル: - 人
https://w.atwiki.jp/imagephoto/pages/12.html
人気商品一覧 @wikiのwikiモードでは #price_list(カテゴリ名) と入力することで、あるカテゴリの売れ筋商品のリストを表示することができます。 カテゴリには以下のキーワードがご利用できます。 キーワード 表示される内容 ps3 PlayStation3 ps2 PlayStation3 psp PSP wii Wii xbox XBOX nds Nintendo DS desctop-pc デスクトップパソコン note-pc ノートパソコン mp3player デジタルオーディオプレイヤー kaden 家電 aircon エアコン camera カメラ game-toy ゲーム・おもちゃ全般 all 指定無し 空白の場合はランダムな商品が表示されます。 ※このプラグインは価格比較サイト@PRICEのデータを利用しています。 たとえば、 #price_list(game-toy) と入力すると以下のように表示されます。 ゲーム・おもちゃ全般の売れ筋商品 #price_list ノートパソコンの売れ筋商品 #price_list 人気商品リスト #price_list
https://w.atwiki.jp/seiyu-coversong/pages/692.html
原曲・GUMI feat.40㍍P 40㍍PによるVOCALOID楽曲。 漫画作品「この美術部には問題がある!」とのタイアップ曲。 【登録タグ 2013年の楽曲 40㍍P GUMI VOCALOID この美術部には問題がある! ニコニコ動画】 カバーした声優 上坂すみれ 小澤亜李 東山奈央 水樹奈々
https://w.atwiki.jp/omomuki/pages/56.html
わたしは好きな絵を描いているという行為に興奮します。 好きなキャラクターを好きな体に好きな体勢に好きな服を着せて好きなことをさせられるんですよ。 描き途中の一瞬だけ見える姿や陰影や光を入れて立体にしていく過程がドキドキします。 絵の中だけ、自分の画面の中の今だけはそのキャラを好きにできるという事はとても支配的な欲が満たされます。 補足やコメント等、語りたいことがあればどうぞコメントください 名前 コメント
https://w.atwiki.jp/imasss/pages/126.html
春香「私こんなイメージなんだねー」 執筆開始日時 2012/04/08 元スレURL http //hayabusa.2ch.net/test/read.cgi/news4vip/1333822380/ 概要 響「どうしたんだ春香?」 春香「あ、響ちゃん えっとね、インターネットで私たちのイメージ見てたんだけど…」 響「あー なんとなくわかったぞー」 春香「私ってなぜかあざとい、芸人肌、黒春香ってイメージがあるみたい あと無個性、リボンがないと誰かわからないとかひどくない? なんでそんなイメージなんだろう… たまに中の人ネタとかあるけど意味がわかんないし」 響「自分なんてぼっちだとか臭いとか散々だぞ」 春香「それも酷いよね」 響「まったくだぞ 動物飼ってるから臭いって世の中の動物飼ってる人に謝れよって言いたいぞ」 タグ ^天海春香 ^我那覇響 まとめサイト SSちゃんねる プロデューサーさんっ!SSですよ、SS!
https://w.atwiki.jp/imagephoto/pages/7.html
アーカイブ @wikiのwikiモードでは #archive_log() と入力することで、特定のウェブページを保存しておくことができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/25_171_ja.html たとえば、#archive_log()と入力すると以下のように表示されます。 保存したいURLとサイト名を入力して"アーカイブログ"をクリックしてみよう サイト名 URL
https://w.atwiki.jp/cocoakkon/pages/7.html
アーカイブ @wikiのwikiモードでは #archive_log() と入力することで、特定のウェブページを保存しておくことができます。 詳しくはこちらをご覧ください。 =>http //atwiki.jp/guide/25_171_ja.html たとえば、#archive_log()と入力すると以下のように表示されます。 保存したいURLとサイト名を入力して"アーカイブログ"をクリックしてみよう サイト名 URL