Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 1 |

 

  Вопрос: Загрузка картинки в PictureBox Добавлено: 19.11.08 16:22  

Автор вопроса:  Владимир
Загружаю любую картинку в PictureBox, таким образом, чтобы она поместилась полностью в PictureBox имеющего размер 500 на 500.
Для этого использую e.Graphics.ScaleTransform(iwh, iwh),
почемуто :
картинка 800х600 меньше чем 500х500,
картинка 1280х1024 больше чем 500х500.
ПОЧЕМУ, не могу понять, я же вычисляю коофициент трансформации ?

Текст программы.
Public Class Form1
Dim ris As New Bitmap(15, 15, Imaging.PixelFormat.Format24bppRgb)

Private Sub ЗагрузитьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ЗагрузитьToolStripMenuItem.Click
        Dim k As Integer
        Dim filenameRead As String
        OpenFileDialog1.ShowDialog()
        filenameRead = OpenFileDialog1.FileName
        If filenameRead = "" Then Exit Sub
        ris = Image.FromFile(filenameRead)
        wi = ris.Width
        hi = ris.Height
        If wi >= hi Then wh = wi Else wh = hi
        iw = 0
        ih = 0
1:
        iwh = 500 / wh
        whi = wh
        wrs = iw
        hrs = ih
        PictureBox1.Refresh()
        
    End Sub

 Private Sub PictureBox1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint
        
        If iwh = 0 Then Exit Sub
        Dim rec As New RectangleF(wrs, hrs, whi, whi) 'x,y коор. вер. лев. в ris прямоуг. разм. х' , y'
        'трансформация , растяжка (>1) или сжатие (<1) одинаково по обеим осям iwh
        e.Graphics.ScaleTransform(iwh, iwh)
        'перенос изображения вырезанного в PictureBox1
        e.Graphics.DrawImage(ris, 0, 0, rec, GraphicsUnit.Pixel) 'x,y коор. вер. лев в PictuteBox1

    End Sub

Ответить

  Ответы Всего ответов: 4  

Номер ответа: 1
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #1
Добавлено: 19.11.08 17:11
зачем ломать голову, если ее уже сломал кто-то другой? :)
  1. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
  2. 'или
  3. PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage


С уважением Павел.

Ответить

Номер ответа: 2
Автор ответа:
 Владимир



Вопросов: 1
Ответов: 2
 Профиль | | #2 Добавлено: 20.11.08 15:56
Не помагает.
Определяю прямоугольную область
Dim rec As New RectangleF(wrs, hrs, whi, whi)
Задаю коэффициент сжатия
 e.Graphics.ScaleTransform(iwh, iwh)
Бросяю в PictureBox
e.Graphics.DrawImage(ris, 0, 0, rec, GraphicsUnit.Pixel)
 
Вырезаная область картинки, должна занимать
всю область PictureBox
Если вырезаю всю исходную картинку,
то на PictureBox она должна разместится полностью,
но без искажения по вертикали или горизонтали,
т.к. коэффициент одинаков по вертикали и горизонтали.
Если загружаю изначально квадратную картинку, то все работает. Если загружаемая картинка прямоугольная,
то происходит не понятность (см.тему).
По моему ваше предложение и не могло помочь,
т.к. выше сказанные 3 действия отменяют настройку
PictureBox1.SizeMode.

Ответить

Номер ответа: 3
Автор ответа:
 __Pavel__



Вопросов: 29
Ответов: 284
 Web-сайт: ммм.сайта.НЕТ
 Профиль | | #3
Добавлено: 21.11.08 01:05
Владимир пишет:
Загружаю любую картинку в PictureBox, таким образом, чтобы она поместилась полностью в PictureBox имеющего размер 500 на 500.

так вам что надо-то? Вписать изображение в PictureBox или изменить размер самого изображения?

Владимир пишет:
т.к. выше сказанные 3 действия отменяют настройку
PictureBox1.SizeMode.

А зачем их делать-то?
объясняю:
1) загружаете изображение в PictureBox:
  1. PictureBox1.Image = ...

2) Выставляете свойство:
  1. PictureBox1.SizeMode = PictureBoxSizeMode.Zoom

3) радуетесь :)

А то что вы делаете - тоже самое что танцевать с бубнами над телефоном чтоб его включить :)

вот вам 2 примера рабочих:
PB - PictureBox
  1.  
  2.     'первый способ:
  3.     'говорим PictureBox'у чтоб он сам изменял размер выводимого изображения, это очень удобно, т.к. он выводит изображение увеличенное
  4.     'до своих размеров (причем в реальном времени!) и при этом не меняет размер самого изображения, т.е. качество не меняется!
  5.     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  6.         Dim d_OD As New OpenFileDialog
  7.         If d_OD.ShowDialog = Windows.Forms.DialogResult.OK Then
  8.             PB.Image = Image.FromFile(d_OD.FileName)
  9.             PB.SizeMode = PictureBoxSizeMode.Zoom
  10.         End If
  11.     End Sub
  12.  
  13.  
  14.     'второй способ:
  15.     'изменяем размер изображения в ручную по заданным размерам, минусы в том что все приходится делать все в ручную
  16.     'и при этом качество будет меняться, если вы например сначало уменьшите в 20х20 а потом увеличите изображние
  17.     'до 300х300 то поймете про что я говорю ;) так что первый способ лучше!!!
  18.     Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  19.         Dim d_OD As New OpenFileDialog
  20.         If d_OD.ShowDialog = Windows.Forms.DialogResult.OK Then
  21.             Dim d_Bitmap As New Bitmap(Image.FromFile(d_OD.FileName), New Size(500, 500))
  22.             PB.Image = d_Bitmap
  23.         End If
  24.     End Sub


С уважением Павел.

Ответить

Номер ответа: 4
Автор ответа:
 Владимир



Вопросов: 1
Ответов: 2
 Профиль | | #4 Добавлено: 21.11.08 08:33
Прошу прощение, но как я писал выше,
из загруженной картинки, я вырезаю квадрат,
иэтот квадрат растягиваю или сжимаяю до размера 500х500
с выводом на PictureBox.
Вчастном случае вырезаем всю картинку для проверки программы.
В программе вычисляется коэффициент сжатия 500/hw,
где hw мин. из размеров картинки. Так вот, я брал разные картинки. Результат: если исходная картинка квадратная,
то все нормально, если прямоугольная то результат непредсказуем. Текое ошущение, что при сжатии берется
не те размеры которые я читаю (ris.Width,ris.Height),
а другие и весьма неожиданные.
Я написал программку, которая изначально имеет коэффициент =0.1, и кнопочки с увеличением и уменьшением
коэффициента на 0.1 с его индикацией. В этом случае
получаемый коэффициент при нужном результате отличается
от вычиляемого.
Вот в чем проблема.
С уважением, Владимир.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам