Отразить picture

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Alprog
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 127
Зарегистрирован: 15.05.2008 (Чт) 14:21
Откуда: Владивосток

Отразить picture

Сообщение Alprog » 16.03.2009 (Пн) 14:09

Подскажите, чем можно отобразить picture слева-направо?
Так, чтобы быстро было, желательно не попиксельно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Отразить picture

Сообщение Хакер » 16.03.2009 (Пн) 14:15

Непопиксельно — никак.
StretchBlt попробуй с инвесрной шириной.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Отразить picture

Сообщение jangle » 16.03.2009 (Пн) 14:39

Хакер прав, только попиксельно. В принципе, даже обычной CopyMemory можно обойтись

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Отразить picture

Сообщение BV » 19.03.2009 (Чт) 16:25

Еще можно воспользоваться StretchDIBits. Но я тут набросал маленький тестик, и оказалось, что StretchBlt быстрее StretchDIBits...

Код: Выделить всё
Option Explicit

Private Type BITMAPINFOHEADER
    biSize As Long
    biWidth As Long
    biHeight As Long
    biPlanes As Integer
    biBitCount As Integer
    biCompression As Long
    biSizeImage As Long
    biXPelsPerMeter As Long
    biYPelsPerMeter As Long
    biClrUsed As Long
    biClrImportant As Long
End Type

Private Type RGBQUAD
    rgbBlue As Byte
    rgbGreen As Byte
    rgbRed As Byte
    rgbReserved As Byte
End Type

Private Type BITMAPINFO
    bmiHeader As BITMAPINFOHEADER
    bmiColors As RGBQUAD
End Type

Private Const BI_RGB As Long = 0
Private Const DIB_RGB_COLORS As Long = 0

Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
Private Declare Function StretchDIBits Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal dx As Long, ByVal dy As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal wSrcWidth As Long, ByVal wSrcHeight As Long, lpBits As Any, lpBitsInfo As BITMAPINFO, ByVal wUsage As Long, ByVal dwRop As Long) As Long
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
Private Declare Function GetTickCount Lib "kernel32.dll" () As Long

Private Sub cmdTest_Click()
    Dim lTime As Long
   
    lTime = GetTickCount()
    Call FlipImageUsingStretchBlt
    MsgBox "StretchBlt time: " + Str$(GetTickCount() - lTime), vbInformation
   
    lTime = GetTickCount()
    Call FlipImageUsingStretchDIBits
    MsgBox "StretchDIBits time: " + Str$(GetTickCount() - lTime), vbInformation
   
End Sub

Private Sub Form_Load()
    picSrc.Picture = LoadPicture(App.Path + "\Img.jpg")
End Sub

Private Sub FlipImageUsingStretchBlt()
    Call StretchBlt(picDest.hdc, 0, 0, picSrc.ScaleWidth, picSrc.ScaleHeight, picSrc.hdc, _
        picSrc.ScaleWidth - 1, 0, -picSrc.ScaleWidth, picSrc.ScaleHeight, vbSrcCopy)
End Sub

Private Sub FlipImageUsingStretchDIBits()
    Dim BMI As BITMAPINFO
    Dim bBytes() As Byte
   
    With BMI.bmiHeader
        .biSize = Len(BMI.bmiHeader)
        .biBitCount = 24
        .biCompression = BI_RGB
        .biPlanes = 1
        .biWidth = picSrc.ScaleWidth
        .biHeight = picSrc.ScaleHeight
    End With
   
    ReDim bBytes(1 To picSrc.ScaleWidth * picSrc.ScaleHeight * 3) As Byte

    Call GetDIBits(picSrc.hdc, picSrc.Image.Handle, 0, picSrc.ScaleHeight, bBytes(1), BMI, DIB_RGB_COLORS)
    Call StretchDIBits(picDest.hdc, 0, 0, picSrc.ScaleWidth, picSrc.ScaleHeight, picSrc.ScaleWidth - 1, 0, _
        -picSrc.ScaleWidth, picSrc.ScaleHeight, bBytes(1), BMI, DIB_RGB_COLORS, vbSrcCopy)
End Sub
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Отразить picture

Сообщение arthur2 » 19.03.2009 (Чт) 17:04

BV писал(а):Еще можно воспользоваться StretchDIBits. Но я тут набросал маленький тестик, и оказалось, что StretchBlt быстрее StretchDIBits...


А у меня StretchDIBits из твоего кода почему-то вообще не заработал: картинка просто стала черной. (StretchBlt сработал нормально)
Артур
 
   

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Re: Отразить picture

Сообщение BV » 19.03.2009 (Чт) 17:21

Проверь пошагово, отработал ли GetDIBits
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1688
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: Отразить picture

Сообщение arthur2 » 19.03.2009 (Чт) 17:26

Нет. Ну, то-есть, он вызвался, но все байты остались нулями :(
Артур
 
   

Penumbra
Обычный пользователь
Обычный пользователь
 
Сообщения: 62
Зарегистрирован: 24.01.2009 (Сб) 13:36

Re: Отразить picture

Сообщение Penumbra » 19.03.2009 (Чт) 18:05

Alprog писал(а):Подскажите, чем можно отобразить picture слева-направо?
Так, чтобы быстро было, желательно не попиксельно.


слева-направо(справо-налево)
Код: Выделить всё
(при  Picture2.AutoRedraw=False )
Picture2.PaintPicture Picture2.Image, Picture2.ScaleWidth, 0, -Picture2.ScaleWidth, Picture2.ScaleHeight, , , , , vbSrcCopy

или
Picture2.PaintPicture tempPicture.Image, Picture2.ScaleWidth, 0, -Picture2.ScaleWidth, Picture2.ScaleHeight, , , , , vbSrcCopy
где tempPicture- временный PictureБокс

с верху вниз (снизу-вверх)
Код: Выделить всё
Picture2.PaintPicture Picture2.Image, 0, Picture2.ScaleHeight, _
                      Picture2.ScaleWidth, -Picture2.ScaleHeight, , , , , vbSrcCopy


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, SemrushBot и гости: 13

    TopList