PictureFromBits and BitsFromPicture

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

PictureFromBits and BitsFromPicture

Сообщение sosed213 » 20.05.2008 (Вт) 21:19

Здраствуйте!

После долгова поиска, ненашел ничего кроме PictureFromBits.
Помогите кто сможет и кто знает!

Надо из PictureBox картинку преобразовать в массив со всеми параметрами (размерами, глубиной цвета и тд.) Тоесть написать обратную функции PictureFromBits!!!

В сети есть пример SaveToJPEG, но там както непонятно, все ходит ходит, а в итоге put m_data()!


Заранее всем спасибо!
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 20.05.2008 (Вт) 21:25

Нашел и чуть чуть подправил примерчик! Все бы было бы отлично но там используется STG.tlb. А мне бы хотелось без дополнительных компонентов.
Вложения
PIC_to_Byte_to_PIC.rar
(21.54 Кб) Скачиваний: 56
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Бяка
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 219
Зарегистрирован: 21.09.2005 (Ср) 21:28

Сообщение Бяка » 21.05.2008 (Ср) 0:59

Вот попробуй

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

Public Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As Any, ByVal wUsage As Long) As Long

Public 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 Any, ByVal wUsage As Long) As Long


Public 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

Public Type SSPBITMAPINFO
  Header As BITMAPINFOHEADER
  BITS() As Byte
End Type

Public SourceBuffer As SSPBITMAPINFO
Private DestBuffer As SSPBITMAPINFO

'получаем масив байт из рисунка
  Sub GetPictur(ByRef Source As Object, ByVal Width As Long, ByVal Height As Long)
Dim SourceWidth As Long, destWidth As Long
Dim SourceHeight As Long, destHeight As Long

  SourceWidth = Width
  SourceHeight = Height
  destWidth = Width
  destHeight = Height
 
  ReDim SourceBuffer.BITS(3, SourceWidth - 1, SourceHeight - 1)
  With SourceBuffer.Header
    .biSize = 40
    .biWidth = SourceWidth
    .biHeight = -SourceHeight
    .biPlanes = 1
    .biBitCount = 32
    .biSizeImage = (3 * SourceWidth * SourceHeight) + 10
  End With
 
  GetDIBits Source.hdc, Source.Image.handle, 0, SourceHeight, SourceBuffer.BITS(0, 0, 0), SourceBuffer, 0&


  End Sub

'применяем к масиву байт эффект старая фотография и обратно ложим на обьект в виде рисунка
Public Sub Filrt(ByRef Source As Object, ByRef Dest As Object, ByVal Width As Long, ByVal Height As Long)
Dim X, Y,  R1, g1, b1
On Error Resume Next
Dim rx, gx, bx, ry, by, gy


  Call GetPicture(Source, Width, Height)

  For Y = 0 To Height - 1
    For X = 0 To Width - 1
    R1 = SourceBuffer.BITS(2, X, Y)
    g1 = SourceBuffer.BITS(1, X, Y)
    b1 = SourceBuffer.BITS(0, X, Y)

          rx = R1 * 0.299 + g1 * 0.587 + b1 * 0.114
          r = IIf(rx + 64 > 255, 255, rx + 64)
          g = IIf(rx + 24 > 255, 255, rx + 24)
          B = IIf(rx + 8 > 255, 255, rx + 8)



        If (r < 0) Then r = 0 Else If (r > 255) Then r = 255
        If (g < 0) Then g = 0 Else If (g > 255) Then g = 255
        If (B < 0) Then B = 0 Else If (B > 255) Then B = 255
        DestBuffer.BITS(2, X, Y) = r
        DestBuffer.BITS(1, X, Y) = g
        DestBuffer.BITS(0, X, Y) = B
    Next X

  Next Y
  SetDIBits Dest.hdc, Dest.Image.handle, 0, Height, DestBuffer.BITS(0, 0, 0), DestBuffer, 0&

End Sub

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 21.05.2008 (Ср) 6:16

Бяка писал(а):Вот попробуй

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


'получаем масив байт из рисунка
  Sub GetPictur(ByRef Source As Object, ByVal Width As Long, ByVal Height As Long)
Dim SourceWidth As Long, destWidth As Long
Dim SourceHeight As Long, destHeight As Long

  SourceWidth = Width
  SourceHeight = Height
  destWidth = Width
  destHeight = Height
 
  ReDim SourceBuffer.BITS(3, SourceWidth - 1, SourceHeight - 1)
  With SourceBuffer.Header
    .biSize = 40
    .biWidth = SourceWidth
    .biHeight = -SourceHeight
    .biPlanes = 1
    .biBitCount = 32
    .biSizeImage = (3 * SourceWidth * SourceHeight) + 10
  End With
 
  GetDIBits Source.hdc, Source.Image.handle, 0, SourceHeight, SourceBuffer.BITS(0, 0, 0), SourceBuffer, 0&


  End Sub




Спасибо, но данный вариант не пойдёт, т.к. если я зделаю:


Код: Выделить всё
Put SourceBuffer.BITS()


то сохранённый файл не откроется на просмотр в программе просмотра изображений.
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 21.05.2008 (Ср) 6:55

sosed213, tlb с ЕХЕ распространять не надо.
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 21.05.2008 (Ср) 10:14

Matew писал(а):sosed213, tlb с ЕХЕ распространять не надо.


Точно! Проверил и правда! Спасибо!
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 21.05.2008 (Ср) 10:21

У меня есть ещё вопросох, хотя не по теме, но около того:

Что такое hDC, и с чем его едят? И как мне создать виртуальный hDC, не привязанный к обыекту, например Picture1.hdc, но чтобы там можно было рисовать. Например когда я делаю так:

DrawIconEx Picture1.hdc, 0, 0, mIcon, 50, 50, 0, 0, DI_NORMAL

То он рисует иконку на Picture1.hdc, а как создать виртуальный hdc, чтобы можно было с ним работать дальше?
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

M.A.R.K
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 11.11.2007 (Вс) 11:50
Откуда: Иркутск

Сообщение M.A.R.K » 21.05.2008 (Ср) 10:34

sosed213
Поиск по:
CreateCompatibleDC, CreateCompatibleBitmap и т.д.
-Решил Хакер блины печь...
-Первый блин у него вышел, как обычно - Комом...
-А второй - Экзешником...

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 21.05.2008 (Ср) 10:42

M.A.R.K писал(а):sosed213
Поиск по:
CreateCompatibleDC, CreateCompatibleBitmap и т.д.


Спасибо за попытку помочь!
Не могу сказать что знаю все, но и за дурака прошу меня не считать.

sosed213
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 206
Зарегистрирован: 13.11.2007 (Вт) 21:19
Откуда: Омск

Сообщение sosed213 » 21.05.2008 (Ср) 13:30

А у когонибудь есть пример(код) загрузки *.png файлов?
Не могу сказать что знаю все, но и за дурака прошу меня не считать.


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

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

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 55

    TopList