• ベストアンサー

試験管のような画像をグラデーション

_ranco_の回答

  • ベストアンサー
  • _ranco_
  • ベストアンサー率58% (126/214)
回答No.2

以下は大急ぎで書いたもので、細部的にはアラがありますが、やり方の基本は学べると思います。このプログラムでは、外枠(”注射器")にBufferedImageを使っていますが、実際は外枠もグラデーションも、どちらも単なるShapeにしてpaintComponent()の中でdrawやfillできます。そのほうが、考え方としてはシンプルです。BufferedImageを使ったのは、透明属性(AlphaComposite)を、下のグラデーションを見せるために便利に使えると思ったからです。2つのShapeを作ったほうが、楽だったかな…。 -------------------------------------------------- import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.*; public class Tube extends JPanel{  int panelWidth, panelHeight;  GeneralPath tube, bar;  BufferedImage tubeImg;  GradientPaint gp;  Arc2D topArc, bottomArc,   leftTopBarc, rightTopBarc; // parts of topArc  Line2D tleft, tright, bleft, bright;  float bodyWidth, bodyLength, bodyFullLength, barWidth, barLength,   domeHeight, barTopY;  Point2D.Float bodyLtop, bodyRtop, bodyLbottom, bodyRbottom,   barBottomLeft, barBottomRight, barCielLeft, barCielRight;  float wrate, hrate;     public Tube(int width, int height){   panelWidth = width;   panelHeight = height;   setPreferredSize(new Dimension(width, height));   setBackground(new Color(240, 240, 240));   wrate = 2f / 5f; // tube width ratio against panel width   hrate = 2f / 4f; // tube height ratio against panel height   bodyWidth = barWidth = (int)(panelWidth * wrate);   domeHeight = bodyWidth / 2;   bodyLength = panelHeight * hrate;   bodyFullLength = bodyLength + bodyWidth; // bw == domeHeight * 2   barLength = bodyFullLength * 0.85f;   bodyLtop = new Point2D.Float    (((1 - wrate) / 2) * panelWidth, ((1 - hrate) / 2) * panelHeight);   bodyLbottom = new Point2D.Float(bodyLtop.x, bodyLtop.y + bodyLength);   bodyRtop = new Point2D.Float(bodyLtop.x + bodyWidth, bodyLtop.y);   bodyRbottom = new Point2D.Float(bodyRtop.x, bodyLbottom.y);   barTopY = (bodyLtop.y - domeHeight) + (bodyFullLength - barLength);   barCielLeft = new Point2D.Float(bodyLtop.x, barTopY);   barCielRight = new Point2D.Float(bodyRtop.x, barTopY);   barBottomLeft    = new Point2D.Float(bodyLbottom.x, bodyLbottom.y + domeHeight);   barBottomRight    = new Point2D.Float(bodyRbottom.x, bodyLbottom.y + domeHeight);   tube = makeTube(bodyLtop, bodyLbottom, bodyRbottom, bodyRtop, bodyWidth);   tubeImg = makeTubeImg(tube);      bar = makeBar(barBottomLeft, barBottomRight, barCielRight, barCielLeft);  }  GeneralPath makeTube(Point2D.Float tl, Point2D.Float bl, Point2D.Float br,   Point2D.Float tr, float width){   GeneralPath gp = new GeneralPath();   gp.append(new Line2D.Float(tl, bl), true);   gp.append(new Arc2D.Float    (new Rectangle2D.Float(bl.x, bl.y - width / 2, width, width),    180, 180, Arc2D.OPEN), true);   gp.append(new Line2D.Float(tr, br), true);   gp.append(new Arc2D.Float    (new Rectangle2D.Float(tl.x, tl.y - width / 2, width, width),    0, 180, Arc2D.OPEN), true);   return gp;  }  GeneralPath makeBar   (Point2D.Float bl, Point2D.Float br, Point2D.Float tr, Point2D.Float tl){   GeneralPath gp = new GeneralPath();   gp.append(new Line2D.Float(bl, br), true);   gp.append(new Line2D.Float(br, tr), true);   gp.append(new Line2D.Float(tr, tl), true);   gp.append(new Line2D.Float(tl, bl), true);   return gp;  }  BufferedImage makeTubeImg(GeneralPath closedShape){   BufferedImage bim    = new BufferedImage(panelWidth, panelHeight, BufferedImage.TYPE_INT_ARGB);   Graphics2D g2d = bim.createGraphics();   g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,    RenderingHints.VALUE_ANTIALIAS_ON);   g2d.setColor(Color.white);   g2d.fillRect(0, 0, panelWidth, panelHeight);   g2d.setColor(Color.black);   g2d.setStroke(new BasicStroke(2.0f));   g2d.draw(closedShape);   g2d.setComposite(AlphaComposite.Clear);   g2d.fill(closedShape);   g2d.dispose();   return bim;  }  public void paintComponent(Graphics g){   super.paintComponent(g);   Graphics2D g2 = (Graphics2D)g;   g2.setPaint(new GradientPaint     (barCielLeft, Color.yellow, bodyLbottom, Color.pink, true));   g2.fill(bar);   g2.drawImage(tubeImg, 0, 0, this);  }  /* test program */  static Tube t;  static JButton up, dw;  public static void main(String[] args){   JFrame frame = new JFrame();   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   Container con = frame.getContentPane();   t = new Tube(400, 400);   con.add(t, BorderLayout.CENTER);   up = new JButton("<html>U<br>P<br></html>");   dw = new JButton("<html>D<br>O<br>W<br>N<br></html>");   up.setPreferredSize(new Dimension(40, 100));   dw.setPreferredSize(new Dimension(40, 100));   UpDown ud = new UpDown();   up.addActionListener(ud);   dw.addActionListener(ud);   JPanel p = new JPanel(new GridLayout(2, 1));   p.add(up);   p.add(dw);   con.add(p, BorderLayout.WEST);   frame.pack();   frame.setVisible(true);  }  static class UpDown implements ActionListener{      public void actionPerformed(ActionEvent e){    float inc;    JButton bt = (JButton)e.getSource();    if (bt == up){     inc = -5;    }    else{     inc = 5;    }    // 以下、本当は増値/減値に際して値チェックが必要です    t.barCielRight     = new Point2D.Float(t.barCielRight.x, t.barCielRight.y + inc);    t.barCielLeft     = new Point2D.Float(t.barCielLeft.x, t.barCielLeft.y + inc);    t.bar = t.makeBar     (t.barBottomLeft, t.barBottomRight, t.barCielRight, t.barCielLeft);    t.repaint();   }  } } --------------------------------------------------

oubokun
質問者

お礼

ここまで作成して頂き、本当にありがとうございます。 実行してみたら、やりたかったことが全て実現されていました。 透明属性も付けたかったので、BufferedImageを使う方法も教えて頂けて良かったです。

関連するQ&A

  • GPLについて

    GPLについてよく分からないので、質問させてください。 QTというGUIフレームワークがありますが、このライブラリのオープンソース版のライセンスはGPLになっています。 このQTのオープンソース版をライブラリとして使用して作ったソフトウェアは、配布する際そのソフトウェアの全てのソースコードを公開しなければいけないのでしょうか?? どなたかご教示頂けると幸いです。

  • 画像フォーマットの読み書き

    設計の段階で迷っています。知恵をお貸し下さい。 グラフィック系のソフトを開発しようと思います。 そのときにJPEGをはじめ多くのフォーマットの読み書きを検討しています。 当初はSUSIEを検討しておりましたが、こちらは出力プラグインがないことや プラグインの数が多いことなどから諦める方向です。 とりあえずWEBを検索してみて次の3つの方法があるのではと推測しました。 1 OpenGLを使う 2 DirectXを使う 3 JpegLibなどオープンソースのライブラリを使う しかし、これらの方法で本当に実現可能かどうかが分からないのです。 はたまた可能として、どれを使用すればベストなのかも予想がつかないのです。 一番確実なのは3番だと思いますが、 この場合は1つのフォーマットにつき1つのライブラリとなるので 多数のフォーマットに対応できるのか、 そしてSUSIE同様多くのプラグインが必要になるかどうかが焦点になります。 よろしくお願いします。

  • 手書き入力

     Javaで有料のライブラリなし(できればオープンソースかJavaのコアAPIか標準拡張)に手書き入力はできないでしょうか? 日本語変換のためではなく 手書き入力した日本語漢字入り文字列をテキストに変換とか。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Mac OS Xでターミナル上で、標準入力の内容をそのままクリップボードにコピーしてくれるコマンド

    Mac OS Xでターミナル(シェル)上から実行できるコマンドで、標準入力の内容をそのままクリップボードにコピーしてくれるようなコマンドは無いでしょうか? 標準のコマンドで存在しなければ、フリーソフトやオープンソースソフトウェアをインストールするという方法でも結構です。 使っているMac OS XのバージョンはTiger (10.4.11)です。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • Mac
  • 画像を保存させないようにするには??こんな感じでOK?

    Windows2000 IE5.5 Vbscript を使っています。 今あるページに画像を表示するとします。 それを保存させたくないです。 そこで、まず右クリックを禁止します。 次に、メニューバーから名前を付けて保存 されたくないので、あるボタンを押して、 サブウィンドウを出して、そのサブウィンドウ を出す時に、メニューバーとかを 削除して、オープンします。 そして、そのサブウィンドウに 画像を表示して、そのサブウィンドウ内で 右クリックを保存してやれば、 保存できないような気がするのですが、 これではダメでしょうか? サブウィンドウのアドレスを ボタンを押すページのソースを見ても 分からなくするものとします。 また、最初にセッション変数を使った、 IDとパスワードの画面を通った人しか ボタンのあるページには入れないものとします。 直接、画像のあるページのアドレスを指定しても、 ログインしてないので、セッション変数で はじかれるようにしてあります。 また、すべてのページの最初に、 履歴を残さないようにする記述をしています。 ただ、不安なのは一度画像のあるページを表示 すると、PCの中に保存されてしまうのではないかと いうことです。画像が保存されてしまうなら、 何をどうやっても、実現不可能な気がします・・・。 画像のキャッシュって残るのでしょうか?

  • オープンソースの考え方を教えてください。

    昨今、オープンソースという言葉が一般的になってきて、とくにLinuxなどは非常に注目されているようですが、いまいちこのあたりの考え方が理解できていません。 ソースコードを公開し、誰もが自由にソフトウエアを触ることが出来るのは、たしかに技術的な進歩という面からみるとメリットがあるだろうことはなんとなく理解できるのですが、とはいえ、誰も彼もが好き勝手にいじっていたのでは、収拾がつかなくなるだろうから、誰かがそれを統率管理する必要があると思います。また、いろんなサポートも必要でしょう。 しかし、当然、それにはかなりの労力を要するでしょうから、全く無償というわけにもいかないし、かといってそこで代償を要求することは、自由発展形態にブレーキをかけることになるでしょうし...。 それとも商売とは全く無縁で、興味と情熱だけでソフトウエアが発展し、将来的には世界標準にさえなりうるという考え方なのでしょうか? 商業ベースに乗らないものが、どうやってこれから発展していくというのか、このあたりがよくわかっていません。 ご教授いただければ幸いです。よろしくお願いします。

  • 画像のグラデーションについて

    こんにちは。 gifやjpg等の画像(写真ではなくブロックのような背景画像です。)を編集するソフトを探しています。 上を濃い色で下を薄くといったようにグラデーションをかけたいのですが、どのようなソフトを使用してよいかわかりません。 できればフリーソフトがよいのですがお勧めはありますか? WinXPを使用しています。

  • グラデーション画像の作り方

    両端が濃くて、中ほどが薄いグラデーション画像を作りたいと思っています。 一方から他方へ向かって薄くなったり濃くなっている画像はJTrimで作成できます。 できればJTrimかGIMPがいいのですが、それ以外の方法でももしあれば教えてください。

  • 画像 グラデーション

    お世話になります。 PhotoShopでもillustratorでもいいのですが 写真の上下に配置して、下のほうの画像ははちょうど 反射している風にしたいんですが。 一番下は何も見えなくてじょじょにグラデーションがかかって ような感じですか。 これかこれのもう少しこった感じで、できれば PhotoShopでもillustratorのどちらでも出来ればと思ってます。 http://colmo-777.com/seihin/img/thumbnail_coming_soon.jpg 以上です、宜しくお願い致します。

  • VBAでフォームのスクロールバーが下にいってしまう

    縦に長いフォームを作っているのですがフォームビューをするとフォームがやや下の方の画面で開けられてしまいます。 原因はフォームオープン時に対象レコードをテキストボックスに入れたり、プルダウンボックスにレコードをセットしたりしているからだと思います。(全てコーディングで) どうすればスクロールバーを一番上まで戻すことができますか?元からスクロールバーを移動させずにレコードをセットする方法でもかまいません。 それともう一つ、フォームのプルダウンボックスに、プロパティの値集合ソースからSQLをセットしたりする方法がありますが、VBAのグローバル変数をWHERE句に使用したい場合はこの方法は使えませんよね? 最後にもう一つクエリはVBAのグローバル変数使えませんよね? フォームのコントロールから値を取得することもできませんよね?