たびたび質問しているhidezoです(^_^;
表題のように、ピクチャボックスにある画像を、別のピクチャボックスにコピーしたいのですが、うまくいきません。
おそらく簡単な解決策があると思うのですが、ヘルプを参照してもよく分かりませんでした。

プログラムの内容
オブジェクト Picture2,Picture3に同じ画像を代入
Piture2上にLineを描画
2回目以降のPiture2にLineを描画する際に一度Picture3を代入して元の画像に戻してからLineを描画
(ゲームでいうとキャラクタ移動でキャラクタと背景の重ね合わせみたいな感じです)

やってみた方法
方法1(ダメでした)
Picture2.Picture = Picture3.Picture
方法2(ダメでした)
Picture2.PaintPicture Picture3.Picture, 0, 0
方法3(できたけど・・・)
SET Picture2.Picture = TMP
※TMPは・・・
Set TMP = LoadPicture(strOpenFile)
Set Picture3.Piture = TMP
方法3の場合、グローバル変数を使わなくちゃいけないので避けたいです。よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こんにちは。

maruru01です。
方法1で出来ますけど。

VBのバージョンとかが違うから?
あと、何か特殊な操作をしてますか?特にピクチャーボックスに。
補足をお願いします。
では。

この回答への補足

VBは6.0です。
実はPicture1というオブジェクトに一度画像データを読み込んでいます。(Autosize=true)
Picture1よりHeight,Widthを取得して、Picture2に縦横比を換えずに最大320x240pixになるようにスケールをかけて代入しています。(これは問題なくできています)
そのPiture2をPiture3にコピーしたいのですが、うまくいきません。(Piture2,3はAutosize=False)
本来なら、Picture2と同様にPiture1からPiture3に代入すればいいのですが、Piture3へPiture2の代入は別オブジェクトでやっていて、何回も繰り返します。
ここで、毎回Picture1のHeight,Widthを取得するのも処理時間がかかるし、Height,Widthをグローバル変数にするのも嫌だと思っています。

以下に、ソースを付けます。(変数に無駄がありますが(^_^;)
Private Sub mnuFileOpen_Click()
Dim strOpenFile As String
On Error GoTo err_mnuFileOpen

CommonDialog1.Filter = "*.jpg|*.jpg|*.bmp|*.bmp|*.gif|*.gif"
CommonDialog1.ShowOpen
strOpenFile = CommonDialog1.FileName
Picture1.Picture = LoadPicture(strOpenFile)
'Set TMP = LoadPicture(strOpenFile)

intOrgPicX = Picture1.Width
intOrgPicY = Picture1.Height

If (320 / intOrgPicX) >= (240 / intOrgPicY) Then
intScale = (240 / intOrgPicY)
Else
intScale = (320 / intOrgPicX)
End If

Picture2.Height = intOrgPicY * intScale
Picture2.Width = intOrgPicX * intScale
Picture2.Visible = True
Picture2.PaintPicture Picture1.Picture, 0, 0, intOrgPicX * intScale, intOrgPicY * intScale

Picture3.Height = intOrgPicY * intScale
Picture3.Width = intOrgPicX * intScale

Picture3.Picture = Picture2.Picture
'Set Picture3.Picture = TMP
'Picture3.PaintPicture Picture1.Picture, 0, 0, intOrgPicX * intScale, intOrgPicY * intScale

err_mnuFileOpen:
Exit Sub

End Sub

補足日時:2002/02/03 13:59
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QA4-2枚集約→A4-1枚にコピーしたいです

いつもお世話になっております。

A4に2枚集約(2アップ)にしてある資料を、A4に1枚裏表にコピーし直したいです。
【元の資料】A4 左側No.1 右側No.2となっているものを(裏は白紙)、
【出来上がり】A4 表No.1 裏No.2にするということです。

【元の資料】をA3に拡大して折ればいいのですが、それだとかさばってしまい、できればA4両面にしたいです。
あと、かなり枚数があるので、できればA3で出力して裁断して節約したいのですが、これは難しいですよね。
【元の資料】A4に、一枚目No.1とNo.2、二枚目No.3とNo.4…となってますから。

コピー機はキンコーズに行くので、性能はいいはずです。

コピーがお得の方、知恵をお貸しください。

Aベストアンサー

キンコーズのコピー機がわかりませんが、多分最新かつ高性能の
機械が入っているはずです。

最近はコンビニなどのコピー機でも両面コピーが可能です。
最初に両面コピーを選んでコピーすれば、1枚目のスキャン、
2枚目のスキャンの順で手順が示されます。
ちょっと難しいのは表面と裏面の上下あわせくらいです。

Qピクチャボックス, PaintPicture 内 LoadPicture関数の使い方

For IA& = Picture02.LBound To Picture02.UBound
Picture02(IA&).AutoRedraw = True
Picture02(IA&).AutoSize = False
Picture02(IA&).ScaleMode = vbPixels
Picture02(IA&).Cls
Next IA&
でSub Form_Load()にて初期化したあとで

IC& = Index
Picture02(IC&).ScaleMode = vbPixels
Picture02(IC&).PaintPicture LoadPicture(InFile$), 0, 0, YokoHaba&, TateTakasa&
Picture02(IC&).Refresh
と読み取ったときに
EOIセグメントが存在しないJPGファイルをInFile$に指定したのときにPicture02(IC&).PaintPictureでハング(CPU=100%, 無応答)します。
ハングアップの検出方法、又はハングアップしない参照方法などの対応をご存知の方いらっしゃいませんか。
Open InFile$ -Close でEOIセグメントの存在をチェックするとわずか50KBのファイルに約1秒(GW-Basic, 80286並の速度)使ってしまいます。より高速な方法を探しています。

OS Win2000 SP2
Visual basic 6.0 SP5
「EOIセグメントが存在しないJPGファイル」はクライアントからサーバーへの送信途中で回線を物理的に切断することにより作成したものです。

For IA& = Picture02.LBound To Picture02.UBound
Picture02(IA&).AutoRedraw = True
Picture02(IA&).AutoSize = False
Picture02(IA&).ScaleMode = vbPixels
Picture02(IA&).Cls
Next IA&
でSub Form_Load()にて初期化したあとで

IC& = Index
Picture02(IC&).ScaleMode = vbPixels
Picture02(IC&).PaintPicture LoadPicture(InFile$), 0, 0, YokoHaba&, TateTakasa&
Picture02(IC&).Refresh
と読み取ったときに
EOIセグメントが存在しないJPGファイルをInFile$に指定したのときにP...続きを読む

Aベストアンサー

こんにちは。KenKen_SP です。

ハングアップの検出方法...これは知りません。で、もう片方の EOI セグメント。
これは Jpeg の End Of Image マーカのことですね?

> Open InFile$ -Close でEOIセグメントの存在をチェックするとわずか50KBの
> ファイルに約1秒(GW-Basic, 80286並の速度)使ってしまいます。

バイナリのヘッダ(SOIマーカ)とフッタ(EOIマーカ)だけ見た簡易チェッカーでは
ダメですかね...。これなら VB 標準のファイル I/O で約 700 KBの JPEG でも
計測不能な瞬時で判定できますけど。

(CPU: P4-2.4GHz Mem:512M WinXP VB6.0 or VBA)

適当に書いたコードですけど、参考になりますか?

' // テスト用時間計測 API
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

' // テストプロシージャ
Sub TestProc()
  Dim lRet As Long
  Dim sMsg As String
  Dim t  As Long
  t = timeGetTime()
  lRet = JpegChecker("C:\sample.jpg")
  t = (timeGetTime() - t) / 1000
  Select Case lRet
    Case -1: sMsg = "ファイルオープンエラー"
    Case 0: sMsg = "Jpeg ではない(破損含む)"
    Case 1: sMsg = "Jpeg だと思う"
  End Select
  Debug.Print "Time:= " & Format$(t, "#,###.000sec")
  Debug.Print "Result:= " & sMsg
End Sub

' // 簡易 Jpeg チェッカー
Private Function JpegChecker(ByVal FilePath As String) As Long

  ' 戻り値 1:Jpeg らしい 0:Jpeg ではない -1:ファイルが開けない
  
  Const JPEG_FILEHEADER As String = "FFD8"
  Const JPEG_FILEFOOTER As String = "FFD9"

  Dim Buf() As Byte
  Dim n   As Integer
  Dim i   As Long
  JpegChecker = -1
  If Dir$(FilePath) <> "" Then
    n = FreeFile()
    On Error GoTo ERROR_HANDLER
    Open FilePath For Binary Access Read As #n
      ReDim Buf(LOF(n) - 1)
      Get #n, , Buf
    Close #n
    On Error GoTo 0
    i = UBound(Buf) - 1
    ' Check Jpeg SOI Marker And EOI Marker
    If HexDump(Buf, 0, 2) = JPEG_FILEHEADER And _
      HexDump(Buf, i, 2) = JPEG_FILEFOOTER Then
      JpegChecker = 1
    Else
      JpegChecker = 0
    End If
    Erase Buf
  End If
  Exit Function
ERROR_HANDLER:
  Err.Clear
  Close #n
End Function

' // 16進ダンプ
Private Function HexDump( _
  ByRef Buf() As Byte, _
  ByVal Pos As Long, _
  ByVal Length As Long, _
  Optional ByVal LitteleEdian As Boolean = True _
) As String

  Dim i  As Long
  Dim sTmp As String
  Dim sRet As String
  For i = Pos To Pos + Length - 1
    sRet = sRet & Right$("0" & Hex$(Buf(i)), 2)
  Next
  If LitteleEdian Then
    HexDump = sRet
  Else
    For i = 1 To Len(sRet) Step 2
      sTmp = sTmp & Right$(sRet, 2)
      sRet = Left(sRet, Len(sRet) - 2)
    Next i
    HexDump = sTmp
  End If
End Function

こんにちは。KenKen_SP です。

ハングアップの検出方法...これは知りません。で、もう片方の EOI セグメント。
これは Jpeg の End Of Image マーカのことですね?

> Open InFile$ -Close でEOIセグメントの存在をチェックするとわずか50KBの
> ファイルに約1秒(GW-Basic, 80286並の速度)使ってしまいます。

バイナリのヘッダ(SOIマーカ)とフッタ(EOIマーカ)だけ見た簡易チェッカーでは
ダメですかね...。これなら VB 標準のファイル I/O で約 700 KBの JPEG でも
計測不能な瞬時で判定できますけど...続きを読む

Qコピー機でA4は縦と横どちらがよい?

コピー機の給紙トレイにA4の紙をいれますが、オフィスにあるものは横長方向に入っているものが多いです。
しかしA3がコピーできる場合、A4は縦長にいれ、縦長に読み込んでコピーしたほうがドラムを通過する距離が短くなって、速度UPとドラムの寿命を長くすることができるような気がします。それでも通常横長に入っているのでこれには何か意図があるのでしょうか?

意味不明な質問ですがよろしくお願いします。

Aベストアンサー

お考えの通り、事務機業界ではA4縦長(というか、これをA4横送りと言います)が標準で、マシンもそれを想定して設計されています。速度を表現する場合も当然A4横送りで比較します。

では縦送りの用途ですが、これはA3からA4の縮小コピーで必要になります。
特にアナログ方式のコピー機ではこれは必須で、A4横送りしか用紙がセットされていないと、A3からA4への縮小がまったく出来ません。

最近主流のデジタルコピー機では、画像を一旦記憶し、A4に縮小後、90度画像を回転させてから書き込むことが可能なため、実はA4縦送りのセットは不要です。
しかしながら、原稿自動送り装置に原稿をセットする際、A3、B4は縦送り、A4、B5は横送りというのがすぐに理解できないユーザーが多い会社では、いちいち説明が面倒なので、原稿の向きを全サイズ揃えた方が判りやすいため、A4、B5とも縦送りでセットするケースが多いです。

(実を言うと、デジタルコピーでは等倍コピー時も画像回転が可能ですから、本当は、原稿セットは縦送り統一でもA4、B5は横送りセットでOKなんですがね。。)

お考えの通り、事務機業界ではA4縦長(というか、これをA4横送りと言います)が標準で、マシンもそれを想定して設計されています。速度を表現する場合も当然A4横送りで比較します。

では縦送りの用途ですが、これはA3からA4の縮小コピーで必要になります。
特にアナログ方式のコピー機ではこれは必須で、A4横送りしか用紙がセットされていないと、A3からA4への縮小がまったく出来ません。

最近主流のデジタルコピー機では、画像を一旦記憶し、A4に縮小後、90度画像を回転させてから書き込むことが可能なた...続きを読む

Qピクチャボックスに描画した画像の保存

VB6.0にて、
http://www.uploda.org/uporg898462.jpg
このようなものを作成しました。
折れ線グラフはプログラムにて後から描画したもの、
それ以外の目盛りなどは最初からピクチャボックスに描画してあるものです。
pic1,pic2は共にピクチャボックスです。

赤い線で囲まれたpic1を目盛り、グラフ、その他のテキストボックスや文字と共に画像として保存したいのですが、
SavePicture Pic1.Image, "C:\SaveTest2.bmp"
とすると、pic1の大きさの、何も描画されていない真っ白な画像が保存されてしまいます。

また、SavePicture Pic2.Image, "C:\SaveTest2.bmp" (pic2の保存)
とすると、折れ線グラフのみが描画され、目盛りは無くなった画像が保存されてしまいます。
2つのピクチャ共にAutoRedraw=Trueを設定しています。

pic1を上手く保存する方法は無いでしょうか?
ご教授、お願いします。

Aベストアンサー

ピクチャボックスのImageプロパティはピクチャボックスのグラフィックメソッド(Line,Circleなど)で描画されたものしか保持しません

WinAPIの Keybd_Eventを使って ALT+PrintScreenを送り
クリップボードにフォームのビットマップを送ります
このピットマップを 非表示のピクチャーボックスなどで受けて
該当部分を BitBltで 別のピクチャーボックスに送り
このImageプロパティを使って SavePictureを実行してみましょう

以下の例は Form2を Form1より少し大きめに作っておきます
Form1の Button1のイベントで ALT+PrintScreen を送信
Form2のPictureプロパティに設定しています

WinAPI BitBltの座標はピクセル単位なので
フォームのScaleModeが Twipなら Screen.TwipsPerPixelXまたはScreen.TwipsPerPixelYで除算してください


Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const VK_SNAPSHOT = &H2C
Private Const VK_MENU = &H12
Private Const KEYEVENTF_EXTENDEDKEY = &H1
Private Const KEYEVENTF_KEYUP = &H2

Private Sub Command2_Click()
AppActivate "Form1"
Clipboard.Clear
' ALTを押す
keybd_event VK_MENU, 0, KEYEVENTF_EXTENDEDKEY, 0
' PrintScreenを押す
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY, 0
' PrintScreenを離す
keybd_event VK_SNAPSHOT, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
' ALTを離す
keybd_event VK_MENU, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0
Dim pic As StdPicture
Do
DoEvents
Do
DoEvents
'Debug.Print Clipboard.GetFormat(vbCFBitmap)
Loop Until Clipboard.GetFormat(vbCFBitmap)
On Error Resume Next
' クリップボードを開くのに失敗するときがあるため
' ループにしてあります
Set pic = Clipboard.GetData(vbCFBitmap)
On Error GoTo 0
Loop While pic Is Nothing
Form2.Picture = pic
Form2.Show
End Sub

ピクチャボックスのImageプロパティはピクチャボックスのグラフィックメソッド(Line,Circleなど)で描画されたものしか保持しません

WinAPIの Keybd_Eventを使って ALT+PrintScreenを送り
クリップボードにフォームのビットマップを送ります
このピットマップを 非表示のピクチャーボックスなどで受けて
該当部分を BitBltで 別のピクチャーボックスに送り
このImageプロパティを使って SavePictureを実行してみましょう

以下の例は Form2を Form1より少し大きめに作っておきます
Form1の Button1のイベ...続きを読む

Qコンビニのコピー機で拡大 A4→A2

コンビニのコピー機で、A4→A2に拡大コピーは出来るんでしょうか?

A2用紙1枚で出来なくても、A4用紙を4枚出力でもいいのですが・・・

出来るのであれば、やり方を教えて下さい。
宜しくお願いします。

Aベストアンサー

セブンイレブンだと
ポスター作成にすればできるでしょう

参考URL:http://www.sej.co.jp/services/copy.html

QPicture の描画について 質問です

「[Picture1]に描画された図形」の上に
「[Picture2]に描画された図形」を重ねて表示したいのですが、
この場合、[Picture2]の背景のみを透明にして、描画された図形のみを表示するという事をしたいです。


a「[Picture1]に半径6cmの色が赤の円」
b「[Picture2]に半径3cmで色が黒の円」

aの上にbを重ねると、外側が赤、内側が黒の二重丸が描画される という具合です。
 この描画が可能なら[Picture1]に限らず他のものでも構いませんので、どうか御教授お願いします。

Aベストアンサー

UserControlを新規に作成すれば上手くいきそうです

プロジェクトに UserControl2個を追加します
1つ目を下に表示する赤
2つ目を上に表示する黒
とします

追加したUserControlの BackStyleを『0-透明』
MaskColorを表示するイメージのマスク部分(赤または黒以外の部分色)に設定します
MaskPictureに表示させたいイメージを登録

といった具合でしょう ...

追加したUserControlに BackStyleやMaskPicture、MaskColorなどを公開してやれば汎用的に使えるかとおもいます

QA4文書のコピー代について

子どもの関係で役員をしていますが、行事等の案内書を作成する係に
なっています。

A4にごく普通の案内文と、ちょっとした地図(カラー)をコピー
した場合、1枚あたりのコストはおいくら程でしょうか。
白黒のみでフォント10程度で埋めた場合はいかがでしょう。

機種はキャノンMP500(インクジェット)です。
(メーカーに問い合わせしましたが、情報が足りないため回答不能
とのことでした。ですので、おおよそでも知りたいのですが)
行事も年に数回あり、その都度30枚ほどコピーし、今回まとめて
の請求となり困っています。
よろしくお願いいたします。

Aベストアンサー

 原稿用紙は無料。コンビニでコピーで10円。
 自宅プリンタですると安くはなりますが、ただ同然扱いになりかねません。主に用紙代ぐらいでしょうか?
 金額をはっきりさせたいのであればコンビニでコピー。5円の所もありますね。後はレジで領収書を発行してもらう、領収書の発行もしてくれるものもコンビニではある。

 プリンタでははっきり言ってわかりません。印刷面はどれぐらいの割合かでも変わります。だからわかりませんとしか言えません。
 色が分離しているとわかりやすいのですが、複数の色を一つのカートリッジで使用する形ですと、他の色が大量余っていても一色がだめだとすべて駄目になることがあります。

 私は用紙代を請求する程度です。用紙も安いものを使用していますのでボランティアの状態でもありますが。

QPicture1.Printとしてもpicture1には何も表示されません

Private Sub Form_Load()
Call kansu
End sub
---------------------------
Private Sub kansu()
a="文字"
Picture1.Print a
End sub
---------------------------

のように、pictureコントロールに
文字を入れる処理をする関数を呼んでいるのですが、
Formが表示されてもpicture1には何も表示されません。
Msgboxを入れておくとメッセージボックスが出るので
呼び出されてはいるようなのです。

この関数をCommand1_Click()などから呼ぶとpicture1コントロールに
ちゃんと表示されます。
どうすればよいのでしょうか?

Aベストアンサー

Private Sub kansu()
  Dim a  As String
  Picture1.AutoRedraw = True
  a = "文字"
  Picture1.Print a
End Sub

QA3まで対応のコピー機ってA4も印刷できるんですか

題名の通りですが
「A3まで対応」と書いてあるコピー機はA4の印刷も可能なのでしょうか?
いまいち紙のサイズについて詳しくないのですが
A3が印刷可能なら当然A4も印刷できますよね?

よろしくお願い致します。

Aベストアンサー

リ○ー の使ってますが A3(大)から はがきサイズ(小)までなら 出来ます。
なので A4も当然出来ますよ。
購入するときに、ブ○ザ-も 検討しましたが やっぱり出来るようでした。
私は B5までしかした事ありませんが・・・。

Q"picture.jpg" の "picture" を取りだすには

お世話になります。

"picture.jpg" のような文字列から 拡張子を省いた値を
取りだすにはどうすれば良いのでしょうか?

Java でいう str.lastIndexOf(".") や substr()
のような関数はあるのでしょうか?


msdn 関数
http://msdn.microsoft.com/ja-jp/library/32s6akha.aspx

Aベストアンサー

こんにちは。

  picture.jpg

の picture の部分をベース名と呼びます。これと開発環境をキーワード
に WEB 検索すると参考記事が見つかりますよ。

.NET 環境なら、GetFileNameWithoutExtension メソッドです。

  System.IO.Path.GetFileNameWithoutExtension("picture.jpg")

VB/VBA 環境なら FileSystemObject の GetBaseName を利用するとか。

  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  MsgBox fso.GetBaseName("picture.jpg")

余談ですが、ベース名と拡張子の切り分けは次の点にご注意を。

1. 拡張子は 3 文字とは限らない
  例)Sample.jpeg、index.html
  --> Left などで3文字前まで、、と単純に切り分けると失敗する
    場合があります。最近では、Office2007 の拡張子が 4 文字に
    なりましたね。また、拡張子が無いファイルもあります。
2. ファイル名に複数のピリオドが有り得る
  例)2008.6.29.xls
  --> 拡張子のピリオド位置をファイル名の前から探すと失敗する
    場合がある。

InStrRev などでファイル名の後ろからピリオドを探すとか、拡張子の
ピリオドが無い場合の処理を追加すれば良いだけですが。

ご参考までに。

こんにちは。

  picture.jpg

の picture の部分をベース名と呼びます。これと開発環境をキーワード
に WEB 検索すると参考記事が見つかりますよ。

.NET 環境なら、GetFileNameWithoutExtension メソッドです。

  System.IO.Path.GetFileNameWithoutExtension("picture.jpg")

VB/VBA 環境なら FileSystemObject の GetBaseName を利用するとか。

  Dim fso As Object
  Set fso = CreateObject("Scripting.FileSystemObject")
  MsgBox fso.GetBaseName("picture.jpg")

余談です...続きを読む


人気Q&Aランキング

おすすめ情報