アプリ版:「スタンプのみでお礼する」機能のリリースについて

今、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)を使用しています。

A 回答 (2件)

> どうすればシステムに依存しないで正しく描画できるでしょうか。



しょうがないなあ。VB は嫌いなんだってば :-)


No.1 で紹介したソースでは GetBitmapBits() とかって API を使っていた
けど、Win16 の遺物なんですね。で、今は GetDIBits() を使え、と。

でも、これって bitmap のフォーマットを知らないと、使うのが厳しいからなあ。

というわけで、microsoft のページを見つけました(→参考URL)。

BitBlt() で、ピクセルを一点一点複写しているのだけれど、API を呼ぶ
回数はほぼ半分だし、質問にあるコードよりは早いことが期待できる。

# かな?

参考URL:http://support.microsoft.com/default.aspx?scid=k …
    • good
    • 0
この回答へのお礼

こんばんは。
またまた参考URLを参照してプロジェクトに組み込んで実行してみました。
No.1のときほど速くならなかったですが、気持ち速くなったのでとりあえずこれで進めてみようと思います。
また時間があるときにでもbitmapについて勉強し、GetDIBits()とかを使ってより高速化に励んでみようと思います。
VB嫌いっておっしゃってるのにしつこく聞いてごめんなさい。
本当にありがとうございました。

お礼日時:2002/04/22 19:51

多分、遅い原因は GetPixel() と SetPixel() の呼び過ぎでしょう。



一旦、メモリDC にビットマップの写しを作って、そこで回転させてから、描画するほうが早いと思いますよ。

因みに、私はVBが嫌いなので、細かいことまで示唆できませんので、サンプルを探してみました。
参考URLのページの最後のほうにある "Rotate a picture 90 degrees (7K)" が、先に示唆したような
内容を実現しているようです。

# 安直なところでは、GetPixel/SetPixel をやっている間、Picture を非表示にしておく、という
# ことも考えたりしました

参考URL:http://www.vb-helper.com/howtoadv.htm
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
参考URLから教えていただいたサンプルをダウンロードしてプロジェクトに追加し実行したところ、かなりの短縮(3.5秒→1秒)になりました。
しかしここで別の問題が・・・。
ビットマップは256色を使用していて、システムのカラーパレットが256色のときはうまくいくのですが、それ以外の場合は正しく描画できません。
どうすればシステムに依存しないで正しく描画できるでしょうか。
ちょっとインターネットで調べてみたのですがさっぱりわかりませんでした。

お礼日時:2002/04/18 17:28

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