今、PictureBox に読み込んだ画像を90度回転して別の PictureBox に表示していますが、処理にとても時間がかかっています。(480×640ピクセルを右90度変換するのに約3.5秒)
もっと処理が早くなる方法があれば教えてください。よろしくお願いします。
---現在の処理(Picture1 → Picture2)---
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Dim p1sw As Long 'Picture1.ScaleWidth
Dim p1sh As Long 'Picture1.ScaleHeight
Dim x1 As Long
Dim y1 As Long
Dim c As Long 'カラーコード
Dim hDC1 As Long 'Picture1.hDC
Dim hDC2 As Long 'Picture2.hDC
Dim X As Long
Dim Y As Long
'縦横サイズを逆転する
With Picture1
p1sw = .ScaleWidth
p1sh = .ScaleHeight
hDC1 = .hdc
End With
With Picture2
.Height = Picture1.Width
.Width = Picture1.Height
hDC2 = .hdc
End With
p1sw = p1sw - 1
p1sh = p1sh - 1
'ピクチャを90度回転
For X = 0 To p1sw 'Picture1のX座標
y1 = X
For Y = 0 To p1sh 'Picture1のY座標
x1 = p1sh - Y
c = GetPixel(hDC1, X, Y) 'カラー情報の取得
'取得したカラーを指定位置に設定する
If c <> -1 Then Call SetPixelV(hDC2, x1, y1, c)
Next Y
Next X
# OSはWindows95、VB6.0(SP5)を使用しています。
No.2ベストアンサー
- 回答日時:
> どうすればシステムに依存しないで正しく描画できるでしょうか。
しょうがないなあ。VB は嫌いなんだってば :-)
No.1 で紹介したソースでは GetBitmapBits() とかって API を使っていた
けど、Win16 の遺物なんですね。で、今は GetDIBits() を使え、と。
でも、これって bitmap のフォーマットを知らないと、使うのが厳しいからなあ。
というわけで、microsoft のページを見つけました(→参考URL)。
BitBlt() で、ピクセルを一点一点複写しているのだけれど、API を呼ぶ
回数はほぼ半分だし、質問にあるコードよりは早いことが期待できる。
# かな?
参考URL:http://support.microsoft.com/default.aspx?scid=k …
こんばんは。
またまた参考URLを参照してプロジェクトに組み込んで実行してみました。
No.1のときほど速くならなかったですが、気持ち速くなったのでとりあえずこれで進めてみようと思います。
また時間があるときにでもbitmapについて勉強し、GetDIBits()とかを使ってより高速化に励んでみようと思います。
VB嫌いっておっしゃってるのにしつこく聞いてごめんなさい。
本当にありがとうございました。
No.1
- 回答日時:
多分、遅い原因は GetPixel() と SetPixel() の呼び過ぎでしょう。
一旦、メモリDC にビットマップの写しを作って、そこで回転させてから、描画するほうが早いと思いますよ。
因みに、私はVBが嫌いなので、細かいことまで示唆できませんので、サンプルを探してみました。
参考URLのページの最後のほうにある "Rotate a picture 90 degrees (7K)" が、先に示唆したような
内容を実現しているようです。
# 安直なところでは、GetPixel/SetPixel をやっている間、Picture を非表示にしておく、という
# ことも考えたりしました
参考URL:http://www.vb-helper.com/howtoadv.htm
回答ありがとうございます。
参考URLから教えていただいたサンプルをダウンロードしてプロジェクトに追加し実行したところ、かなりの短縮(3.5秒→1秒)になりました。
しかしここで別の問題が・・・。
ビットマップは256色を使用していて、システムのカラーパレットが256色のときはうまくいくのですが、それ以外の場合は正しく描画できません。
どうすればシステムに依存しないで正しく描画できるでしょうか。
ちょっとインターネットで調べてみたのですがさっぱりわかりませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Access(アクセス) Vba Userformを前面に出すについて 3 2022/04/15 12:29
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) VBA処理追加 こちらでご教示頂いたのですが回答完了させてしまいましたのでこちらからまた質問させてく 2 2022/10/27 09:57
- Visual Basic(VBA) VBA 別ブックからの転記の高速化について VBA 別ブックからの転記の高速化についてご教授下さい。 19 2022/07/26 13:07
- Visual Basic(VBA) 前回ご教授いただいたコードに覚えたてのループ処理で品名りんごAから順に20回for nextでループ 7 2023/01/13 22:01
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
画像処理について。(移動)
-
画像処理
-
SCALEの使い方教えてください
-
(VB)ピクチャボックスに表示し...
-
SavePictureで保存できない
-
消す軌跡と残す軌跡
-
C言語のOpenGLで複数のテクスチ...
-
ASPで日付(期間)検索
-
複雑な条件の書き方
-
C#のループでtextboxに値を入れ...
-
他のフォームから別のフォーム...
-
Excel VBAでsub,dimは何の略?
-
ドラゴン曲線を再帰で書く
-
VB.NETでのイベントの途中終了
-
VS CodeでTEXファイルにPDF形式...
-
Functionの戻り値を配列にした...
-
リストビューの列ヘッダーの幅...
-
Pythonでのかんたんな物理シミ...
-
texで図と表を並べたい
-
RichTextBoxで指定行の色を自動...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SCALEの使い方教えてください
-
PictureBoxでのアニメーション...
-
FlexGridで文字色を変更。
-
ボールが壁に当たって跳ね返る...
-
Matlabでsin波を使って矩形波を...
-
SavePictureで保存できない
-
ピッ、ってアルファベットでど...
-
VB6でマウスのドラッグで範囲を...
-
Picture box の サイズを変更
-
ホンテットマンションに乗った...
-
Matlab/SimulinkのChirp信号に...
-
C言語のOpenGLで複数のテクスチ...
-
[ASP]小数点第2位以下をカット!
-
文字間の幅の設定
-
ピクチャーボックスの画像を印...
-
ASPで日付(期間)検索
-
BMPファイルを作成し保存
-
画像処理
-
マウスポインタの変更
-
画像をランダムに表示させたい...
おすすめ情報