- ベストアンサー
VC#2010 アスペクト比を保った拡大縮小
- アスペクト比を保った拡大縮小について質問です。本を開いたようなイメージで、Panelの中に2個のPictureBoxを左右に配置しています。Panelのサイズを拡大縮小した時に、画像の元のアスペクト比を保ったまま拡大縮小したい。
- 現在は画像がチラついてしまったり、PictureBoxのBackColorが画像の端に微妙に見えてしまうという問題があります。また、計算式についてもよりスマートな方法があれば教えていただきたいとのことです。
- 具体的な処理として、mPictureBoxクラスのRefleshPositionメソッドが挙げられます。このメソッドはmPictureBoxのPaintイベントや親のSizeChangedで呼ばれます。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
関連するQ&A
- Visual Basic 拡大方法について
こんばんわ Visual Basic 2010を使用してプログラミングをしています。 地図の画像を読み込み、ダブルクリックをすると拡大するというものを組んでいます。 ただ、ダブルクリックすると拡大するところまではできたのですが ダブルクリックしたところがパソコンの画面の中央にくるようにするにはどうすればいいかがわかりません。 方法が分かるかた助言、アドバイスよろしくお願いいたします。 参考までに現在組んでいる拡大部分のコードは以下のようになっています。 パソコンの画面サイズは1200*800です Private Sub PictureBox1_DoubleClick(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.DoubleClick Dim bmp = New Bitmap(PictureBox1.Image, PictureBox1.Width * 1.5, PictureBox1.Height * 1.5) PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize PictureBox1.Image = bmp PictureBox1.Refresh() End Sub よろしくお願いいたします。
- 締切済み
- Visual Basic
- C言語による間引き拡大縮小
http://csharpimage.blog60.fc2.com/blog-entry-18.html をみて、単純間引きによる拡大縮小を C言語風に書こうとしているのですが、 rescale[i+j] =layer[(int)xpos+(int)ypos];部分がよくわかりません。 24bppのRawファイル(RGB)を拡大縮小しようとしています。 rescale[i+j] =layer[(int)xpos+(int)ypos];の layer[(int)xpos+(int)ypos];部分をどうしたらいいのか悩んでいます。 layer:24bppRawを読み込むメモリ アドバイスお願い致します。m(___)m FILE *fpt_output; int width=Common_Data_Raw->width; int height=Common_Data_Raw->height; // 拡大縮小後の画像サイズ int hxSize=Common_Data_Raw->width_rescale; int hySize=Common_Data_Raw->height_rescale; // 拡大縮小用 int xSize=width; int ySize=height; double xpos, ypos; double hokanX = (double)xSize / hxSize; double hokanY = (double)ySize / hySize; unsigned char *layer,*rescale; //読み込み layer=(unsigned char*)malloc(3*width*height*sizeof(unsigned char)); fread(&layer[0],sizeof(unsigned char),3*width*height,fpt); //拡大縮小後のサイズ rescale=(unsigned char*)malloc(3*hxSize*hySize*sizeof(unsigned char)); ypos = 0.0; for (int i = 0; i < 3*hxSize*hySize; i+= 3*hxSize) { xpos = 0.0; for (int j=0;j<3*hxSize;j+=3) { // 単純補間・間引き rescale[i+j] =layer[(int)xpos+(int)ypos]; rescale[i+j+1]=layer[(int)xpos, (int)ypos]; rescale[i+j+2]=layer[(int)xpos, (int)ypos]; xpos += hokanX; } ypos += hokanY; } _wfopen_s(&fpt_output,L"output.raw",L"wb"); fwrite(&rescale[0],sizeof(unsigned char),3*width*height,fpt_output); fclose(fpt); fclose(fpt_output); free(layer); free(rescale); return 0;
- ベストアンサー
- C・C++・C#
- PHP ファイルアップロードの縮小方法(比率)
初めまして。PHP の初心者で勉強中なのですが、 ファイルのアップロードの際に確認として 画像を指定範囲に表示したいと考えています。 参考サイトで http://usualcms.net/contents/index/page/49/middle/201106/ で縮小する事ができ、 http://usualcms.net/contents/index/page/31/middle/201106/category_id/ で比率を変えずに縮小する関数の定義 とあるのですが、この二つを組み合わせて試行錯誤したのですが 行き詰まってしまいました。 <?php function getImgSize ($path, $new_width, $new_height) { $size = array(); list ($getWidth,$getHeight) = getimagesize ($path); $w = $new_height / $getHeight * $getWidth; $h = $new_width / $getWidth * $getHeight; //幅と高さの両方が指定より小さい場合 if ($getWidth <= $new_width && $getHeight <= $new_height) { $size['new_width'] = (int)$getWidth; $size['new_height'] = (int)$getHeight; //幅が指定より大きい場合 } else if ($w >= $new_width && $h < $new_height) { $size['new_width'] = (int)$new_width; $size['new_height'] = (int)$h; //高さが指定より大きい場合 } else if ($w < $new_width && $h >= $new_height) { $size['new_width'] = (int)$w; $size['new_height'] = (int)$new_height; } return $size; } if (isset($_POST['index_submit'])) { $type = $_FILES['upfile1']['type']; if ($type == 'image/jpeg' || $type == 'image/gif' || $type == 'image/png') { $ext = str_replace('image/', '', $_FILES['upfile1']['type']); $path = 'image.'.$ext; move_uploaded_file($_FILES['upfile1']['tmp_name'], $path); $new_width = 200; $new_height = 200; $new_image = imagecreatetruecolor ($new_width, $new_height); if ($type == 'image/jpeg') { $image = imagecreatefromjpeg ($path); } else if ($type == 'image/gif') { $image = imagecreatefromgif ($path); } else if ($type == 'image/png') { $image = imagecreatefrompng ($path); } imagecopyresampled ($new_image,$image, 0,0,0,0,$new_width,$new_height, $getWidth,$getHeight ); imagejpeg ($new_image, $path, 100); echo "<img src='".$path."' />"; } else { var_dump ('error'); } } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title></title> </head> <body> <form enctype="multipart/form-data" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" > <input type="file" name="upfile1" /><br /> <input type="submit" name="index_submit" /> </form> </body> </html> 定義したgetImgSize関数がうまく結びついていないのは自分でも分かるのですが、 getImgSize関数を機能させる方法がうまく分からず悩んでいます。 お分かりになる方からすればご指摘だらけかと思いますが、 お力を貸していただければ大変うれしく思います。 よろしくお願い致します。
- ベストアンサー
- PHP
- 画像の縮小のプログラムのエラーについて教えて下さい
java初心者です、宜しくお願いします。 画像の縮小のプログラムを色々と他のサンプルコードとかを参考にしながら 書きましたが、黒い四角形がWindowに表示されるだけです。 プログラム自体のエラーは表示されません。 一体どこが悪いのでしょうか、宜しくお願いします。 ===================================================== public class reSizedIImage extends Applet { Image img ; private MediaTracker tracker; BufferedImage bufimg ; BufferedImage re_img ; public void init() { setBackground( Color.white ) ; img = Toolkit.getDefaultToolkit().getImage( "a.jpg" ) ; tracker = new MediaTracker( this ) ; tracker.addImage( img , 1 ) ; try { // tracker.waitForID( 1 ) ; } catch ( Exception ex ) { ex.printStackTrace() ; } int imgw = img.getWidth( this ) ; int imgh = img.getHeight( this ) ; System.out.println(" imgw = " + imgw + " imgh = " + imgh ) ; int re_width = 300 ; int re_height = 300 ; bufimg = new BufferedImage( img.getWidth( this ) , img.getHeight( this ) , BufferedImage.TYPE_INT_RGB ) ; re_img = new BufferedImage( re_width , re_height , BufferedImage.TYPE_INT_RGB ) ; AffineTransformOp ato = new AffineTransformOp ( AffineTransform.getScaleInstance ( ( double )re_width / img.getWidth( this ) , ( double ) re_height / img.getHeight( this ) ) , null ) ; ato.filter( bufimg , re_img ) ; int re_w = re_img.getWidth(this); int re_h = re_img.getHeight(this); System.out.println(" re_img_w = " + re_w + " re_img_h = " + re_h ) ; } public void paint( Graphics g ) { g.drawImage( re_img , 200 , 200 , this ) ; } }
- ベストアンサー
- Java
- C# Picturebox 縮小・拡大時の表示方法
下記のようなコードで、画像の拡大・縮小を行っています。 ただ画像の縮小時、PictureBox内の余分な部分について、(1)縮小前の 画像が残像のように表示されています。 また通常、画像の拡大・縮小前の画像では画像サイズがPictureBoxよりも大きいサイズの 場合、スクロールバーを表示するようにしています。 (2)でも、画像拡大時、スクロールバーが出るには出ているのですが、画像全てを 確認できません。 (1)、(2)の問題について、解決方法をご存知の方、お願いです、、、教えてください。。。 かなり、困ってます。。。。 Bitmap img = new Bitmap(pictureBox1.Image.Tag.ToString()); //PictureBox1のGraphicsオブジェクトの作成 Graphics g = pictureBox1.CreateGraphics(); //拡大・もしくは縮小 RectangleF rect = new RectangleF(0, 0, zoom * img.Width, zoom * img.Height); g.DrawImage(img, rect); //BitmapとGraphicsオブジェクトを破棄 img.Dispose(); g.Dispose();
- 締切済み
- Visual Basic
- C# panelのなかのpctureBox
panel1のなかのpictureBox1 QNo.8077421の続き http://okwave.jp/qa8077421.html Form1にPicturBox1をはりつけてダブルクリックでイベントハンドラを作る Properties.Resources.IconH;は、*.bmp private void pictureBox1_Click(object sender, EventArgs e) { pictureBox1.Image = Properties.Resources.IconH; } これは、OK private void pictureBox1_Click(object sender, EventArgs e) { int a = 1; Control c = this.Controls["PictureBox"+a.ToString()]; ((PictureBox)c).Image = Properties.Resources.IconH; } これも、OK ここからがうまくいきません。 panel1を貼り付けPicturBox1をpanel1のなかに。 pictureBox1.Image = Properties.Resources.IconH; これは、OK ここからです。 int a = 1; Control c = this.Controls["PictureBox"+a.ToString()]; ((PictureBox)c).Image = Properties.Resources.IconH; これは、 NG NullReferenceException はハンドルされませんでした。 オブジェクト参照がオブジェクト インスタンスに設定されていません。 ((PictureBox)c).Image = Properties.Resources.IconH;これ これをつかいたい。 アドバイスをお願いできませんでしょうか。
- ベストアンサー
- C・C++・C#
- VC#のGraphicsでBmpがにじむ
VC#でビットマップのファイルを表示するプログラムの勉強をしています。以下のようなコードを書いてみました。 Graphics mGraphics; Bitmap mBitmap; PictureBox mPictureBox; mGraphics = mPictureBox.CreateGraphics(); mBitmap = new Bitmap(file_name); int width = (int)(mBitmap.Width * mRatio); int height = (int)(mBitmap.Height * mRatio); mGraphics.DrawImage(mBitmap, 0, 0, width, height); このような感じで、拡大ボタンをクリックするとmRatioを大きくして拡大表示するようなものです。これで拡大表示自体はできたのですが、各ドット(ピクセル?)が確認できるほどに拡大すると、ドットの輪郭がにじんだように表示されます。もちろん、元々のファイルをペイント等で開いて拡大表示するとくっきりした正方形になっています。拡大表示してもにじまないようにする方法はあるのでしょうか。ご存じの方がいらっしゃったらご教授くださいますようにお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- ドラッグを用いての拡大/縮小 ピクチャボックスについて
QNo.2999555の続きの質問です。元の質問のコピーと共に質問します。 >VB6.0により、プログラムの実行後、フォームウィンドウの端(角)を>ドラッグすることにより、(ボタンやボックスを含め)全体を拡大,縮 >小させることはできますでしょうか? >フォームウィンドウの端からのドラッグはデフォルトでも出来るので >すが、フォームウィンドウのみが拡大,縮小されてしまい,ボタンやボ>ックスは元の大きさのままになってしまいます。 この質問については、Form_resize イベントに Public Sub Form_Resize_Ctl(KmForm As Object, _ OrgSize As ReSize_Tag) Dim ParH As Double ' 縦比率 Dim ParW As Double ' 横比率 Dim KmControl As Control ' フォームのコントロール Dim OrgFont As Double ' フォントサイズ退避 ElseIf TypeOf KmControl Is Line Then ' Line .X1 = .X1 * ParW .X2 = .X2 * ParW .Y1 = .Y1 * ParH .Y2 = .Y2 * ParH ElseIf TypeOf KmControl Is PictureBox Then ' PictureBox .FontSize = .FontSize * ParW Select Case .Align Case 0 ' .Top = .Top * ParH .Left = .Left * ParW .Height = .Height * ParH .Width = .Width * ParW … 等と拡大・縮小処理を記述し、解決したかと思ったのですが、 プログラム実行以前からのラインはしっかり拡大・縮小されるのですが、 実行後にピクチャボックス内に描画したラインは指定した座標に描かれたまま、周りのコントロールや文字のみが拡大・縮小されてしまいました。ラインの描画は折れ線グラフとして用いているのですが、 描画したラインのみがその場にそのままの大きさで留まってしまいます。 プログラム実行後に描画したラインも拡大・縮小は可能でしょうか? ご教授、お願いします。
- ベストアンサー
- Visual Basic
- PHP GD 画像が縮小できない
宜しくお願いします。 ※ローカル環境です。 (WinXP PHP5 Smarty PEAR MySQL ※GDはインストされています。) 下記のコードで、サーバーにもともと上げてある画像(jpeg)を縮小して、 それをブラウザに表示させようと思います。 ですが、縮小されずに、元の画像サイズのまま表示されてしまいます。 おかしな点をご指摘下さいませ。 また、(1)で、 jpegファイルを取り込むコードがありますが、これは、 もし画像がGIFであったりPNGの場合を顧慮するなら、 取り込む際にそれぞれを判定するのが基本でしょうか? もし、今回のようにサバー元の画像をリサイズするのであれば、拡張子もわかっていますので、 jpegファイルだけのことを考えればいいですが、 たとえば、任意のアップロードされたファイルを扱う場合は、上記3種類を判定すして処理すべきですよね? 以上、2点を回答下さいませ。 // -- (1) // 画像を読み込む。 $file_path = "http://www元画像.com/img/aa.jpg"; $image = ImageCreateFromJPEG($file_path); //JPEGファイルを読み込む /*********** $image = ImageCreateFromGIF($file_path); //GIFファイルを読み込む $image = ImageCreateFromPNG($file_path); //PNGファイルを読み込む ************/ // -- (2) // 画像のサイズを取得。 $width = ImageSX($image); //横幅(ピクセル) $height = ImageSY($image); //縦幅(ピクセル) // -- (3) // 縮小した画像のサイズを決める。 $new_width = 100; $rate = $new_width/$width; //圧縮比 $new_height = $rate*$height; // -- (4) // 空の画像を作成する。 $new_image = ImageCreateTrueColor($new_width, $new_height); // -- (5) // サンプリングしなおす ImageCopyResampled($new_image,$image,0,0,0,0,$new_width,$new_height,$width,$height); // -- (6) // ブラウザに出力する場合。 ImageJPEG($image); //ImageJPEG($image,'simpletext.jpg'); //ImageGIF($image); //環境によっては使えない //ImagePNG($image); // -- (7) // メモリを解放する。 imagedestroy ($new_image); imagedestroy ($image);
- ベストアンサー
- PHP
- C#のlabelの表示について
C#のlabelの表示について カテ違いですが、C#のカテゴリがないのでここで質問させていただきます。 以下の時刻を表示するプログラムを作成したのですが、 //現在の時刻を取得 DateTime dt = DateTime.Now; int Second_1 = dt.Second % 10; int Second_2 = dt.Second / 10; int Minute_1 = dt.Minute % 10; int Minute_2 = dt.Minute / 10; int Hour_1 = dt.Hour % 10; int Hour_2 = dt.Hour / 10; label1.Text = Second_1.ToString(); label2.Text = Second_2.ToString(); label3.Text = Minute_1.ToString(); label4.Text = Minute_2.ToString(); label5.Text = Hour_1.ToString(); label6.Text = Hour_2.ToString(); if (int.Parse(label1.Text) == 0 && int.Parse(label2.Text) == 0) { int a; for (a = 0; a < 10; a++) { pictureBox4.Top += 1; System.Threading.Thread.Sleep(30); } for (a = 0; a < 50; a++) { pictureBox4.Top += 5; System.Threading.Thread.Sleep(10); } pictureBox4.Top = 12; } label1は「秒」の1の位、 label2は「秒」の10の位、 pictureBox4は「分」の1の位の画像を表示しています。 pictureBoxとlabelを重ねて、画像の上に時刻を表示しています。 秒が0になったとき(分の位が一つ上がるとき)、 分の位の画像を移動させて(forループ2つ)再び元の位置に戻しているのですが(pictureBox4.Top = 12;) そのとき秒が「00」とはならず「59」のままで、このループが終わると「00」を飛ばして「01」となります。 ちなみにこの部分はタイマーで0.2秒ごとに回しています。 原因がわかりませんので、ご教授願います。 また、ループには概算で0.8秒かかりますが、この間、タイマーの呼び出しは実行されているのでしょうか? 加えて、pictureBox4.Topの値を動かしていますが、重ねて配置しているlabelも一緒に動いてくれます。 いろいろなサイト様を参考に、 this.label3.Parent = this.pictureBox4; と親コントロールをFormから変更したのですが、このためでしょうか? 変な表現がありましたらご容赦ください。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
お礼
ご回答ありがとうございます! 凄いです。尊敬します。 チラつきの件ですが、教えて頂いた様にやってみると、確認できました。 サンプルで頂きましたユーザーコントロールを作ってやるやり方は、とてもスマートに感じられましたので、tarosu9000さんのソースを参考にしながら、やってみようと思います。 コメントの書き方もとても勉強になります。 デリゲートのやり方がこれから勉強しながらになりますので、自前で完成できるのはちょっと後になりそうですが、がんばってやって見ます。 ありがとうございました!