tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトル画像の角度変更
記事No11311
投稿日: 2014/08/24(Sun) 04:27
投稿者りらっくま
vb2010を使っているんんですが質問する場所がわからなかったので
ここに書き込みました。すいません
画像の左上を中心に任意の角度で回転させて、その回転させた角度を表示するという
プログラムを作りたいのですが、どうすればいいかわかりません。
どなたかご教授お願いします。

[ツリー表示へ]
タイトルRe: 画像の角度変更
記事No11312
投稿日: 2014/08/24(Sun) 13:23
投稿者VBレスキュー(花ちゃん)
通常下記のように90度毎の回転表示しか綺麗に表示できません。
任意の回転となるとドット抜けが発生するためです。
http://www.hanatyan.sakura.ne.jp/vb2005/vb2013picturebox01.htm#no4

又、左上を中心にしたいのはどのような理由からでしょうか?
通常は、画像の中心が起点になるのですが、理由によっては方法等が変わってきます。

任意の位置に回転表示させるには、三角関数等を使って表示位置を算出する必要があります。
http://www.hanatyan.sakura.ne.jp/vb6/drawing09.htm

リンク先のコードや記事を参考にし、今一度どこまで自分でできてどこが解らないかを
ポイントを絞って質問して下さい。(左上を中心にしたい理由等も追加して)

まったく解りません的な、丸投げの質問にはレスが付きません。

[ツリー表示へ]
タイトルRe: 画像の角度変更
記事No11313
投稿日: 2014/08/25(Mon) 11:07
投稿者魔界の仮面弁士
> 画像の左上を中心に任意の角度で回転させて、その回転させた角度を表示するという
> プログラムを作りたいのですが、どうすればいいかわかりません。

「WPF アプリケーション」として作成してみては如何でしょうか。
RenderTransform プロパティを使うことで、自由に回転できます。

' 画像の左上(0, 0)を起点に、時計回りに45度回転させる
Me.Image1.RenderTransform = New RotateTransform() With { .Angle = 45, .CenterX = 0, .CenterY = 0}



Slider などにバインドさせて使えば、VB のコードすら不要です。

<Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="240" Width="387">
    <StackPanel x:Name="LayoutRoot" Background="White">
        <StackPanel Orientation="Horizontal">
            <Label Height="27" HorizontalAlignment="Left" Name="Label1" VerticalAlignment="Top" Width="53"
                   Content="{Binding ElementName=Slider1,Path=Value,StringFormat=F1}">
            </Label>
            <Slider Name="Slider1" Minimum="0" Maximum="360" Value="0" Margin="0" Width="243" />
        </StackPanel>
        <Image Margin="80,80" Name="Image1" Stretch="Fill"
               Source="http://hanatyan.sakura.ne.jp/img/hanatyan.gif">
            <Image.RenderTransform>
                <RotateTransform Angle="{Binding ElementName=Slider1,Path=Value,StringFormat=F1}" CenterX="0" CenterY="0"/>
            </Image.RenderTransform>
        </Image>
    </StackPanel>
</Window>


# URL が禁止されている掲示板なので、XAML コードが貼りにくい…。orz

[ツリー表示へ]
タイトルRe^2: 画像の角度変更
記事No11314
投稿日: 2014/08/26(Tue) 11:04
投稿者魔界の仮面弁士
Windows フォーム アプリケーション版を作ってみました。

肝となるのは、DrawImage で画像を描画する前の
「RotateTransform(回転角) メソッド」での回転角指定と、
「TranslateTransform(dx, dy) メソッド」での原点座標変更です。


Public Class Form1
    Private WithEvents Label1 As Label
    Private WithEvents TrackBar1 As TrackBar
    Private WithEvents PictureBox1 As PictureBox
    Private bmp As Bitmap

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        bmp = Me.Icon.ToBitmap()    '回転させたい画像


        '---> 以下の部分は、通常はデザイン時に設定しておく
        Label1 = New Label()
        TrackBar1 = New TrackBar()
        PictureBox1 = New PictureBox()

        Label1.Text = 90
        Label1.Width = 50
        Controls.Add(Label1)

        TrackBar1.BeginInit()
        TrackBar1.Minimum = 0
        TrackBar1.Maximum = 360
        TrackBar1.Value = 45
        TrackBar1.TickFrequency = 15
        TrackBar1.TickStyle = TickStyle.Both
        TrackBar1.LargeChange = 10
        TrackBar1.SmallChange = 1
        TrackBar1.SetBounds(55, 0, ClientRectangle.Width - 60, -1)
        TrackBar1.Anchor = AnchorStyles.Top Or AnchorStyles.Left Or AnchorStyles.Right
        Controls.Add(TrackBar1)
        Label1.DataBindings.Add("Text", TrackBar1, "Value")
        TrackBar1.EndInit()

        PictureBox1.BorderStyle = BorderStyle.Fixed3D
        PictureBox1.SetBounds(5, TrackBar1.Bottom + 5, ClientRectangle.Width - 10, _
                              ClientRectangle.Height - 10 - TrackBar1.Bottom)
        PictureBox1.Anchor = AnchorStyles.Top Or AnchorStyles.Right _
                          Or AnchorStyles.Bottom Or AnchorStyles.Left
        Controls.Add(PictureBox1)
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        bmp.Dispose()   '不要になった画像の後始末
    End Sub

    Private Sub PictureBox1_Paint(sender As Object, e As PaintEventArgs) Handles PictureBox1.Paint
        '回転させるので、少し余白を設ける
        Dim margin As Single = 1.5F * Math.Max(bmp.Width, bmp.Height)

        e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.HighSpeed
        e.Graphics.TranslateTransform(margin, margin)   '原点(0,0)座標を右下方向にずらす
        e.Graphics.RotateTransform(TrackBar1.Value)     '回転させる
        e.Graphics.DrawImage(bmp, 0, 0)                 '画像を描画
    End Sub

    Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged
        PictureBox1.Invalidate()    '回転角を変更したので、再描画を依頼する
    End Sub
End Class

[ツリー表示へ]