Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: BitBlt и Image Добавлено: 07.03.09 02:30  

Автор вопроса:  Aston | ICQ: 214-179-991 
Привет всем.
Ребята подскажите плизз можно ли как то АПИ функцию BitBlt применить к Image, к Picture - знаю что можно. Мне просто надо свойство Streatch использовать, а в Picture нет его. Или подскажите как можно сделать так, чтобы Picture уменьшало картинку до своего размера?

Ответить

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

Номер ответа: 1
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #1
Добавлено: 07.03.09 02:38
юзай апи StretchBlt

Ответить

Номер ответа: 2
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #2 Добавлено: 07.03.09 14:50
Это АПИ подходит только для picture для image я незнаю как его использовать, вроде даже нельзя так как у image нет hDC а с picture пытался и чё то не выходит, пол нэта облазил, подскажите как можно реализовать если знаете.

Ответить

Номер ответа: 3
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #3
Добавлено: 07.03.09 15:09
для имейджа никак. но эта апи умеет стретчить изображение. читай доки и примеры

Ответить

Номер ответа: 4
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #4 Добавлено: 07.03.09 15:33
Если можешь то дай ссылочку плиз :)

Ответить

Номер ответа: 5
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #5
Добавлено: 07.03.09 17:07
http://lmgtfy.com/?q=StretchBlt

Ответить

Номер ответа: 6
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #6 Добавлено: 07.03.09 19:27
Не не помогает решить проблему в вб6, в ВБ нэт даже юзать АПИ не надо там всё встроено в пиктуребокс и всё красиво а реализовать надо на вб6 :(

Ответить

Номер ответа: 7
Автор ответа:
 Ra$cal



ICQ: 8068014 

Вопросов: 18
Ответов: 817
 Web-сайт: www.rascalspb.narod.ru
 Профиль | | #7
Добавлено: 07.03.09 19:45
значит не судьба

Ответить

Номер ответа: 8
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #8
Добавлено: 08.03.09 02:55
что значит не помогает)) StretchBlt больше не будет ресайзить изображения?

Ответить

Номер ответа: 9
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #9 Добавлено: 08.03.09 18:59
Винанд если честно, я не пойму как его правильно использовать. Нашёл вот примерчик - он изменяет размер пиктуре но в два раза, как то зацепить у меня не получилось его, например с изменением размера формы или самого пиктуре -он начинает как то глучить - не увеличивает и уменьшает а растягивает.
Добавьте на форму 2 PictureBox и 1 CommandButton.

Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal Nwidth As Long, ByVal Nheight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
Const SRCCOPY = &HCC0020

Private Sub ImgResize(src As PictureBox, TmpPic As PictureBox, mWidth As Long, mHeight As Long)
src.AutoRedraw = False
TmpPic.AutoRedraw = True
TmpPic.Height = mHeight 'установка размеров невидимого picturebox
TmpPic.Width = mWidth
StretchBlt TmpPic.hdc, 0, 0, mWidth, mHeight, src.hdc, 0, 0, src.Width, src.Height, SRCCOPY
'сохранить временной файл на диске
SavePicture TmpPic.Image, App.Path + "\tempimg.bmp"
'перезагрузить оригинальный picturebox
src.AutoSize = True
src.Picture = LoadPicture(App.Path + "\tempimg.bmp";)
'удалить временной файл
Kill App.Path + "\tempimg.bmp"
'очистить невидимый picturebox
TmpPic.Picture = LoadPicture()
'пример для вызова функции
'ImgResize Picture1, Picture2, Picture1.Width / 2, Picture1.Height / 2
End Sub

Private Sub Command1_Click()
ImgResize Picture1, Picture2, Picture1.Width / 2, Picture1.Height / 2
End Sub

Private Sub Form_Load()
Picture2.Visible = False
End Sub

Ответить

Номер ответа: 10
Автор ответа:
 VerhoLom



Вопросов: 20
Ответов: 285
 Профиль | | #10 Добавлено: 09.03.09 15:23
К Image-контролу можно применить. Там же есть свойство Picture/Image, у которых обязательно есть свойство Handle - манипулятор загруженного растра. Прием такой: делается один совместимый DC (CreateCompatibleDc) и в него выбирается этот самый Handle (SelectObject), после чего БитБлитом рисуется с него где угодно. Примерно так...

Ответить

Номер ответа: 11
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #11 Добавлено: 09.03.09 17:09
Вбмэн, Попробую, не был бы счастлив если бы ты хоть небольшой примерчик покачал, я если честно с графикой на большое вы разговариваю :)

Ответить

Номер ответа: 12
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #12
Добавлено: 10.03.09 02:58
PictureBox pic: autoredraw=true, scalemode=pixels
PictureBox src: autoredraw=true, scalemode=pixels, autosize=true, picture=<any>
Form: scalemode=pixels

  1. Option Explicit
  2. Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
  3. Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
  4. Private sizing As Boolean
  5.  
  6. Private Sub pic_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  7.     If Button = 1 Then
  8.         sizing = True
  9.         pic.Move pic.Left, pic.Top, X + 10, Y + 10
  10.     End If
  11. End Sub
  12.  
  13. Private Sub pic_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  14.     If X < 0 Then X = 0
  15.     If Y < 0 Then Y = 0
  16.     If sizing Then pic.Move pic.Left, pic.Top, X + 10, Y + 10
  17. End Sub
  18.  
  19. Private Sub pic_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  20.     sizing = False
  21. End Sub
  22.  
  23. Private Sub pic_Resize()
  24.     SetStretchBltMode pic.hdc, 4
  25.     StretchBlt pic.hdc, 0, 0, pic.Width, pic.Height, src.hdc, 0, 0, src.Width, src.Height, vbSrcCopy
  26.     pic.Refresh
  27. End Sub

Ответить

Номер ответа: 13
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #13 Добавлено: 10.03.09 11:59
Винанд, спасиб работает, но не совсем так как хотелось - вечером буду разбираться мож чё то придумаю. Проблема в том, что при растягивании всё кульно, а при уменьшении следы от прежнего размера рисунка на форме остаются на некоторое время, а с этим надо бороться :). Как будто он перерисовывает только ту часть, которая соответсует реальному размеру уменьшения, а ненужную обрезает не сразу.

Ответить

Номер ответа: 14
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #14
Добавлено: 10.03.09 12:33
Попробуй
Form: autoredraw=true

Ответить

Номер ответа: 15
Автор ответа:
 Aston



ICQ: 214-179-991 

Вопросов: 42
Ответов: 272
 Профиль | | #15 Добавлено: 11.03.09 00:08
Нет это не дело в Form: autoredraw=true, ставил не помогло. Если честно, то в апи не очень и в графике не очень. А в остатках при уменьшении в пиктуре по ходу избавится нельзя, единственное что я смог сделать так это уменьшить их влияние.
SetStretchBltMode pic.hdc, 3
Поменял 4 на 3 - понял что это апи устанавливает свойство растягивание определённого объекта и методом тыка попробовал, уменьшает но всё же остатки небольше есть при резком уменьшении.
Ещё вот используя старую небольшую инфу по BitBlt вот что придумал. :)
  1. Option Explicit
  2. Private Declare Function StretchBlt Lib "gdi32.dll" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal nSrcWidth As Long, ByVal nSrcHeight As Long, ByVal dwRop As Long) As Long
  3. Private Declare Function SetStretchBltMode Lib "gdi32.dll" (ByVal hdc As Long, ByVal nStretchMode As Long) As Long
  4. Private sizing As Boolean
  5.  
  6. Private Sub Form_Resize()
  7. Form1.Cls
  8. SetStretchBltMode Form1.hdc, 3
  9. StretchBlt Form1.hdc, 80 / 5, 80 / 5, Form1.Width - 750, Form1.Height - 1150, src.hdc, 0, 0, src.Width, src.Height, vbSrcCopy
  10. Form1.Refresh
  11. End Sub

везде использовал твип, авторедроу у обоих = труе.
Вот тут вроде без остатков, даже при резком изменении разсеров.
По сути решилась та проблема что я не мог решить - большое спасибо всем. И изменяя размеры формы мне кажется и покрасивее получилось - по крайней мере мне так кажется.

Ответить

Страница: 1 | 2 |

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



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