こんにちは。趣味でプログラミングをしているものです。 さっそくですが、質問させて頂きます。 360*270 の jpg 画像をセピア調に変換して 元の画像をJPanelのサブクラスの上半分、 変換した画像を下半分に描画しようとして 以下のサイトを参考にしてコードを書いてみましたが セピア調の画像が描画されませんでした。 http://www40.atwiki.jp/spellbound/pages/190.html AcrionScript のサイトですので、 RGBの各数値の設定に誤りがあるのでしょうか それとも、自分のコードに誤りがあるのでしょうか 以下にコードを載せさせていただきます コード内部のコメント test statement で 出力された ピクセルの配列の値は -7559704 が出力されました。 package sepiatest; import java.awt.*; import javax.swing.*; import java.awt.image.PixelGrabber; import java.awt.image.MemoryImageSource; public class SepiaTestPanel extends JPanel { Image originalImage; Image modifiedImage; SepiaTestPanel() { super(); setPreferredSize( new Dimension( 360, 540 ) ); setBackground( new Color( 200, 230, 230 )); originalImage = new ImageIcon( "./image/image3.jpg").getImage(); modifiedImage = getSepiaImage( originalImage ); } private Image getSepiaImage( Image srcimage ) { Image retImage = null; int width = srcimage.getWidth( this ); int height = srcimage.getHeight( this ); int[] pix = new int[ width*height ]; PixelGrabber grabber = new PixelGrabber( srcimage, 0, 0, width, height, pix, 0, width ); try { grabber.grabPixels(); } catch( InterruptedException ie01 ) { } // (a) test statement System.out.println( String.valueOf( pix[1])); // float gray = 0f; int color = 0; int red = 0; int green = 0; int blue = 0; int idx = 0; for( int h=0; h>>16 ) & 255; green = ( color>>>8 ) & 255; blue = color & 255; gray = red * 0.298912f + green * 0.586611f + blue * 0.114478f; red = (int)( gray*0.9f); green = (int)( gray*0.7f); blue = (int) (gray*0.4f); red = red<<16; green = green << 8; // blue = blue; color = red | green | blue; pix[idx] = color; } } MemoryImageSource mis = new MemoryImageSource( width, height, pix, 0, width ); // createImage は awt.Component から継承したメソッド // 引数は ImageProducer 型 retImage = createImage( mis ); return retImage; } public void paintComponent( Graphics g ) { g.drawImage( originalImage, 0,0, null ); g.drawImage( modifiedImage, 0, 271, null ); } public static void main( String[] args ) { JFrame frame = new JFrame( "Sepia Test"); frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); SepiaTestPanel stp = new SepiaTestPanel(); frame.getContentPane().add( stp ); frame.setResizable( false ); frame.pack(); frame.setVisible( true ); } } 長文で申しわけありませんが ご存知の方、教えていただけないでしょうか? よろしくおねがいします。
↧