• ベストアンサー

javaのpixelの色の指定に関して

javaの色に関して質問します。 現在PixelGrabberで取得したpixelの中である条件を満たすpixelを指定の色に変換するプログラムを書いているのですが、自分が指定している色と実際に出力される色との違いに悩んでいます。 私が調べた範囲の理解だと pixelはint形式で上の桁から1バイトずつα値(透明度),R,G,Bと表現していると考えています。そこで黒と白を 白=0x00ffffff 黒=0x00000000 と指定しているのですが、真っ黒になってしまいます。指定した色で塗るために知恵を貸してください。お願いします。 ----------------実際のアルゴリズムとデータ---------------- ある閾値よりも濃い色→黒 そうでなければ   →白 この値をintの配列にいれ直す 配列からMemoryImageSorceを作る。 bufferedImageに変換して ImageIOのwriteメソッドで書き込む。 ---------------------------結果--------------------------- 添付の画像 グレースケールっぽい画像を二値化

質問者が選んだベストアンサー

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.2

変換結果が、こんな感じで、良いのかな?? 青一色にしてみました。

Duke_Mike
質問者

お礼

そうです。こんな感じです。 どうやって色を指定したのでしょうか? 是非教えてください。 javaで元の画像の色の白い所の内容を見たら int a(白い所)=-1 これをバイト値でずらした結果 α(α値)=255; r(レッド)=255; g(グリーン)=255; b(ブルー)=255; 0xffffffff=-1; ですので設定してる値はおかしくないと思うのですが、うまくいきません。 配列からbufferedImageにする方法が違うのでしょうか。 よろしければその当たりを教えていただけないでしょうか。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • tom11
  • ベストアンサー率53% (134/251)
回答No.4

追伸です。 int white = 0xFFFFFFFF になり、結果は、-1で言いと思います。 javaでは、C言語のように、unsignedつまり符号なし 表現がないので、0xFFFFFFFFを符号付表現にすると -1になるはずです。 setRGB、getRGBのセットする色の値は int型なので、 int red = 0xFFFF0000 int green =0xFF00FF00 int blue =0xFF0000FF にして、赤なら、redをセットするだけの様です。

Duke_Mike
質問者

お礼

どうもありがとうございます。 つまり補数表現になるということですよね。 書かれた値から考えるに赤緑青全てFFなので白色で 白紙の上に赤を書くということをいいたかったのですね。 ご丁寧にどうもありがとうございます。 pixelgrabberではうまくいきそうにないので、 教えていただいた方法でやってみたいと思います。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 やった手順を書きます。 まず、Dukeさんの、アップした画像を、キャプチャーして jpegの画像に変換しました。 gifでも良いのですが。gifだと白黒256段色調に なるみたいです。 白黒の画は、jpegしても、大体256段色調で、 RとGとBの値が、全部同じ表現になるようです。 例えば 0xFF464646とか、0xFFefefefとか、 0xFFの部分は、不透明を意味しているようです。 また、efより、46の方が、黒っぽくなります。 そこで、jepgの画像を、imageio.readで、 bufferedimageに代入します。 後は、簡単です。 イメージの一点一点をbufferedimageのgetRGBメソッドで 読み込みます。 今回の、境界は、 0xFFFaFaFaにしました。 これ以下の、値は、0xFF0000FFつまり青に変換して、 これ以上の値は、0xFFFFFFFFつまり白に変換しました。 変換方法は、単に、buffereimageのsetRGBメソッドで、 値をセットするだけです。 以上で、二色の画像が出来ました

全文を見る
すると、全ての回答が全文表示されます。
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

まずは、System.out.print() でも使って、作った配列の中身を表示してみた方がいいんじゃないかな? きっと、全部 0x00000000 なんでしょう。 >ある閾値よりも濃い色→黒 >そうでなければ   →白 ここの判定法に問題ありそうです。 元データと、判定部分、配列にデータ格納部分のソースを提示された方が、より解決に近づくでしょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • JAVAにおける画像のJPEG保存の高速化

    現在USBWebカメラを利用し、画像処理をしたのちに画像をJPEG形式で保存するというプログラムを作成しています。 入力画像ビットマップデータをINT配列化⇒画像処理⇒INT配列をBufferedImageに変換⇒JPEGで保存 という流れです。 このとき、以下のコードでBufferedImageをJPEGで保存しています。 public void saveJpgbuf(BufferedImage ssimg ,String fname ) throws IOException { //ImageIO.setUseCache(true);//プログラムの初めで実行済み ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); ImageOutputStream out = ImageIO.createImageOutputStream(new File("c:\\"+fname + ".jpg")); writer.setOutput(out); writer.write(ssimg); out.close(); } しかし、この処理が非常に重いようで、現状のノートPC(Corei5 2.56GHz)では一画像の保存に20msはかかってしまうようです。 保存先をramdiskに変えても17msはかかります。 他の処理と比べてこの保存処理のコストが非常に高く、全体のパフォーマンスを低下させています。 このような処理を高速化できる方法はありませんでしょうか?

    • ベストアンサー
    • Java
  • javaで画像を表示したのですが、変です。

    画像をのせたのですが、表示した画像の透明部分のところに予期しない形で画像が重なってしまいます。 また、ウィンドウのサイズを何回かスクロールしていじると元に戻ります。 文字数の関係ですべてのソースを乗せられないのですが、自作画像クラスだけ記載します。 import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO; import javax.swing.JPanel; public class Layer extends JPanel { BufferedImage image; int x=0,y=0; //表示サイズ int lx=0,ly=0; //表示場所 int originalX,originalY; int startX,startY; Layer(){ } public void p(String imgpath,int lX,int lY,int X,int Y){ x=X;y=Y;lx=lX;ly=lY; image=Imagedraw(imgpath); } public void p(String imgpath,int lX,int lY){ lx=lX;ly=lY; image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public void p(String imgpath){ image=Imagedraw(imgpath); x=originalX; y=originalY; setSize(x,y); } public BufferedImage Imagedraw(String imgpath){ BufferedImage img=null; try{ img = readImage(imgpath); }catch(Exception e){ e.printStackTrace(); } setLocation(lx,ly); setSize(x,y); return img; } public void setLocation(int lX, int lY){ lx=lX;ly=lY; super.setLocation(lx,ly); } public void paint(Graphics g){ //イメージを描画 g.drawImage(image,0,0,x,y,startX,startY,x+startX,y+startY,this); } public BufferedImage readImage(String path) throws IOException{ BufferedImage img; img = ImageIO.read(new File(path)); originalX=img.getWidth(); originalY=img.getHeight(); return img; } } どなたか原因に心当たりのある方、よろしくお願いいたします。 なお、画像はインターネット上での拾いものです。書かれた方には感謝いたします。

  • ピクセル単位の画像をjpgのファイルに保存するには?

    画像をpixelgrabberにて取り込むとint型の配列に置き換わると思うのですが、この状態からjpgのファイルに保存したいのですが、どうしたらいいのでしょうか。よろしくご教授お願い致します。

  • JAVAのプログラミングについて質問があります。

    私は今、javaのGUIのAWTについてのプログラミング問題で頭を抱えています。自分でも一応考えてみたのですが1週間やってみましたが歯がたちません。お忙しいところ恐縮なのですが問題の答えを示してもらえると大変助かります。以下が問題文です。「1953×2250pixelの画像を以下の方法で描画するプログラムを作成しなさい。 配列pixelcolor[1953][2250]に0から254までの値が与えられている。0を黒、254を白、その中間は値が大きくなるほど白に近づくグレーとし、配列pixelcolor(x.y)の値からpixel(x.y)を描画する。」 どうかお願いいたします。

    • ベストアンサー
    • Java
  • ピクセル情報について

    画像を読み込んでピクセル情報を取得して、 R.G.B値を操作しようとして次の様にプログラムを組みました。 (抜粋ですみません) pg = new PixelGrabber(img1,0,0,width,height,pixel,0,width); try { pg.grabPixels(); System.out.println("pg ok"); //デバッグ表示用 } catch(InterruptedException e) { System.out.println(e); } for(int i=0; i<width*height; i++) { int pix = pixel[i]; int red = 0xff & (pix >> 16); int green = 0xff & (pix >> 8); int blue = 0xff & pix; red += uppoint; green += uppoint; blue += uppoint; pixel[i] = (0xff000000 | red<<16 | green<<8 | blue); } 旨く動けばR.G.B値にuppoint分の数値が足されるはずなんですが、エラーがでてしまいます。 何処が悪いのか判らなくて困っています。 どなたか教えていただけないでしょうか?

  • 任意の文字列をJAVAで画像化

    表題にある通り任意の文字列をJAVAで画像化したいと思い 下記サンプルを検索して見つけたのですが作成される画像は 真っ白な画像で文字列は表示されませんでした。 任意の文字列を画像として出力するにはどうすればよいでしょうか。 import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class Test5 { public static void main(String[] args) { String str = "abc123"; new Test5().Create(str); System.out.println(str); } public void Create(String str) { int w=60; int h=17; try { //受け取った文字列を画像化 BufferedImage image=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB); Graphics2D g2d=image.createGraphics(); g2d.setBackground(Color.WHITE); g2d.clearRect(0,0,w,h); g2d.setColor(Color.BLACK); g2d.drawString(str,0,0); ImageIO.write(image, "JPEG", new File("c:\\test.jpg")); } catch(Exception e) { e.printStackTrace(); } } }

    • ベストアンサー
    • Java
  • 画像処理アルゴリズム

    いちおうC#でやってますが、あくまで考え方、概念、アルゴリズムの回答で構いません 今取りあえず、ある画像の全ピクセルのRGBとHSVデータを配列として持っているとします 色情報[x,y][R]に赤 色情報[x,y][G]に緑 色情報[x,y][B]に青 同様に HSV[x,y][H]にH HSV[x,y][S]にS HSV[x,y][V]にV ここから、配列をfor文で回してもなんでもいいんですが、画像の色情報を取得して 1.単色刷り画像の取得(白、黒、ある色のみで高声された画像、閾値でふるい分け) (黒白赤,黒白薄緑とか) を実現するためにどうすればいいでしょうか? (全部の色を混ぜてその色の彩度で判定・・・しらたちょっと予想と違う検索結果に・・・)

  • 8bit透過PNGを書き出すと劣化?する

    最後にソースを記載しますが、やりたいことは 8bitの透過PNG画像を複数枚読み込み、重ねた1枚の画像を出力する、ということなのですが、どうにも画質が劣化?してしまって解決法が見出せずにいます。 以下のソースで読み込んでいるPNG画像は8bitの透過PNG画像で、BufferedImage.TYPE_BYTE_INDEXEDのBufferedImageに書きだして保存しているだけ(のつもり)です。 それだけで読み込んだもの、書きだしたものの品質が大きく違ってしまっています。 Javaで画像を扱ったことがほとんど無いので、そもそもTYPE_BYTE_INDEXEDを使うとそういう結果になるのは仕方のないことなのか、というのもわかりません。 ちなみにTYPE_4BYTE_ABGRを使うと劣化なく出力されますが、32bitなので。。。 どうにか読んだ8bit透過PNG画像をそのままの品質で書きだす方法はないものでしょうか? アドバイスをお願いいたします。。 ※添付画像は左側が下記ソース中のsrc.pngにあたるもの、右側がdest.pngにあたるものです。 画像添付がjpegしかできなかったので透過していませんが、円形以外の白色部分は実際には透過しています。 -以下ソースです-------------------- public class ImageTest { public static void main() { BufferedImage pileupImg = null; try { pileupImg = ImageIO.read(new File("C:/src.png")); } catch (IOException e) { return; } PixelGrabber pg = new PixelGrabber(pileupImg, 0, 0, -1, -1, true); try { pg.grabPixels(); } catch (InterruptedException e){} Image img = Toolkit.getDefaultToolkit().createImage(new MemoryImageSource(256, 256, (int[])pg.getPixels(), 0, 256)); BufferedImage bi = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_INDEXED, (IndexColorModel)pileupImg.getColorModel()); Graphics g = bi.getGraphics(); g.drawImage(img, 0, 0, null); try { ImageIO.write(bi, "png", new File("C:/dest.png")); } catch (IOException e) {} return; } }

  • JAVAのプログラミングについて質問です。

    現在、あるサイトを参考にして class AppCanvas extends Canvas{ BufferedImage image;//ウィンドウに表示するイメージ //コンストラクタ AppCanvas(){ image=loadImage("input.jpg");//表示用のイメージを取り込み } //イメージをファイルから取り込む BufferedImage loadImage(String name){ try{ FileInputStream in=new FileInputStream(name);//FileInputStreamを作る BufferedImage rv=ImageIO.read(in);//イメージを取り込む in.close();//閉じる return rv;//戻り値に読み込んだイメージをセット }catch(IOException e){ //エラー時の処理(エラーを表示)しnullを返す System.out.println("Err e="+e);//エラーを表示 return null;//null を返す } } //表示の必要があれば実行されるメソッド public void paint(Graphics g){ int x2=getWidth();//画面の幅を取得 int y2=getHeight();//画面の高さを取得 int iw=image.getWidth(this);//イメージの幅を取得 int ih=image.getHeight(this);//イメージの高さを取得 int x0=0;//画面左位置 int y0=0;//画面上端位置 int x1=x2/2;//画面中央位置(横) int y1=y2/2;//画5面中央位置(縦) int sX=300;//画像表示開始位置(水平方向) int sY=300;//画像表示開始位置(垂直方向) int eX=600;//画像表示流量位置(水平位置) int eY=600;//画表示終了位置(垂直位置) g.drawImage(image, x0,y0,x1,y1,this);//画面の左上にイメージを縮小して表示 g.drawImage(image,x1,y1,x2,y2,sX,sY,eX,eY,this);//画面右下に一部を拡大して表示 } } // //WindowAdapterは、WindowListerの機能を持ちますが、 //必要なメソッドだけを書けば、WindowListenerとして使えます // class Adapter extends WindowAdapter { //右上の「×」クリックされると呼び出される public void windowClosing(WindowEvent e){ System.exit(0);//アプリの終了 } } というプログラムを書き、添付した画像のように左上に取りこんだinputの画像、 その右下にその一部を拡大したものを表示、というものになっています。 これを用い、inputの画像を魚眼レンズで撮ったような画像にし、右下に表示される拡大されたものを、 魚眼レンズで撮ったような画像から、一般のレンズで撮ったような画像へ変換して表示したいと考えています。 その場合、どのようにソースコードを書き換えればいいでしょうか? ほとんどプログラミング経験がなく、困っています。

    • ベストアンサー
    • Java
  • vector配列の重複を無くすには?

    画像処理で各ピクセルごとのRGB値をそれぞれ取得し、 重複を除いた形で全て表示したいと考えています。 (仮に4ピクセルしかないとして、RGB(255,255,0), RGB(255,255,255),RGB(255,255,255),RGB(255,0,255) といった値が取れたときにRGB(255,255,0), RGB(255,255,255),RGB(255,0,255)のみを表示するといった感じです。) 画像ごとにピクセル数が異なり分からないので、 各ピクセルのRGB値を格納するのに動的配列vector<int*> pixelを 用い、そこにred,green,blueそれぞれの値を格納した 配列RGB[3]を格納しようと思い以下のように書いたのですが、 vector配列に配列を格納したときに重複を削除する方法が 分からず困っています。 for(int x = 0; x->width; x++) { for(int y = 0; y->height; y++) { /*getRGBはそのピクセルのRGB値を取得する仮想関数*/ RGB[0] = (int)getRGB(x,y,RED); RGB[1] = (int)getRGB(x,y,GREEN); RGB[2] = (int)getRGB(x,y,BLUE); } } pixel.push_back(RGB); と格納しても、そこからpixel配列に格納された物の中から RGBが全て一致するものを消去する方法が分かりません。 格納していたものが配列でなければ、pixelをsortして、 unique関数で重複を無くせるのでしょうが… どなたか良い方法をご教授願えませんでしょうか?

このQ&Aのポイント
  • PX-S885の待機中に、頻繁に電源を立ち上げて動作音がする現象が発生しています。電源ボタンのランプが消灯してから直ぐに点灯し、液晶画面も一度消灯しています。
  • この現象は、まるで電源を立ち上げている状態を繰り返しているかのように見えます。
  • 不具合の可能性がありますので、EPSON社製品についての質問です。
回答を見る

専門家に質問してみよう