Имя: Пароль:
1C
 
Ищу прогу, которая сохраняет картинку буфера обмена в файл?
0 Гений 1С
 
гуру
20.11.08
18:30
Т.е. запускаешь ее. и она сохраняет картинку в файл
1 Мой ник
 
20.11.08
18:31
"Картинку буфера обмена"
2 Варвар
 
20.11.08
18:31
paint ctrl+v ctrl+s
наверное долго?
3 Fragster
 
гуру
20.11.08
18:32
rundll + cClipboardObject.Dll
4 Гений 1С
 
гуру
20.11.08
18:35
(3) это уже интересно, можно поподробнее?
5 Гений 1С
 
гуру
20.11.08
18:35
(2) Программа! А не руки
6 Exec
 
20.11.08
18:36
кнопка PrintScreen, а затем ctrl+v в любой гр.редактор?
7 Fragster
 
гуру
20.11.08
18:38
rundll позволяет запускать функции из dll а у cClipboardObject есть функция по сохранению картинки из буфера обмена в файл... но самой dll у меня нету, про функцию такую вчера здеся на мисте услышал....
8 Exec
 
20.11.08
18:39
или тебе что-то вроде CaptureEze Pro надо?
9 у лю 427
 
20.11.08
18:43
ну одноЭсники мудаки.... полные...


программа буфера обмена сама умеет все сохранять и восстанавливать и не только картинки...
10 YauheniL
 
20.11.08
18:43
hypersnap

fraps512
11 у лю 427
 
20.11.08
18:44
еще один придуроДятел....

ps прога есть в любых виндах....
12 Господин ПЖ
 
20.11.08
18:46
clipboard viewer в составе винды
13 у лю 427
 
20.11.08
18:47
(12) умный? так нах расмисделся?
14 Гений 1С
 
гуру
20.11.08
19:04
(12) ПРограммно, а не руками.
(11) какая программа?
15 Гений 1С
 
гуру
20.11.08
19:04
(7) Блин, это уже интересно
16 AlexSSSS
 
20.11.08
20:39
(0) нетрудно догадаться по названию кто автор темы, а по содержимому - зачем сироже это нужно. Наверняка для автоматизации процесса сбора порнофоток. Сося, ну куда тебе столько порнухи то....
17 Варвар
 
20.11.08
21:31
судя по постам пита и    Fragster ответ есть дето там:
http://search.microsoft.com/results.aspx?form=MSHOME&mkt=en-US&setlang=en-US&q=clipboard
Хотя и могли бы просвятить без распальцовки...
18 Denisыч
 
20.11.08
21:36
19 Denisыч
 
20.11.08
21:36
Работа с буфером обмена Windows из командной строки
Автор: Андрей Крупин
Опубликовано 09 января 2007 года

Как научиться мастерски манипулировать содержимым буфера обмена Windows из консоли, не обращаясь к графическому интерфейсу операционной системы? Подобный вопрос нередко задают себе пользователи, занимающиеся написанием BAT- или CMD-скриптов с целью автоматизации часто выполняемых задач и желающих хоть как-то расширить возможности командного интерпретатора.

Предлагаемое нами решение задачи управления буфером обмена Windows из командной строки основано на использовании программных наработок Карла Питерсона, объединенных под общим названием ConClip. Чтобы воспользоваться ими, необходимо скачать со страницы разработчика архив conclip.zip размером в 45,6 килобайтов и извлечь из него две бесплатные утилиты GetClip и SetClip.1

Первая программа GetClip предназначена для извлечения хранимой в буфере обмена Windows текстовой информации средствами следующих основных ключей:
/text - вывод данных обычным текстом (используется по умолчанию)
/rtf - вывод данных в формате RTF
/html - вывод данных в формате HTML
/enum - отображение форматов объектов, присутствующих в буфере
/? - вызов справки

Вторая утилита SetClip выполняет противоположную задачу, то есть помещает указанный текст в буфер обмена операционной системы. В качестве передаваемых приложению параметров могут использоваться ключи:
/clear - очистка буфера
/text - копирование данных в буфер в формате обычного текста (применяется по умолчанию)
/rtf - пересылка данных в виде документа RTF
/html - копирование данных в буфер в гипертекстовом формате
/add - добавление новых данных к уже хранящимся в буфере обмена (используется для разноформатных объектов)
/append - добавление новых данных к уже присутствующим в буфере (применяется только текстовых объектов)
/? - вызов справки

И напоследок приведем несколько команд, демонстрирующих возможности перечисленных утилит.
C:\>getclip.exe > somefile.txt

Данная инструкция извлечет хранимый в буфере обмена Windows текст и переадресует его в файл с именем somefile.txt.
C:\>setclip.exe < setuplog.txt

Эта команда перенаправит содержимое файла setuplog.txt в буфер обмена.
C:\>dir | setclip.exe

Наконец, данная инструкция скопирует в буфер список файловых объектов, хранимых в текущей директории на жестком диске компьютера.

1. Перед запуском утилит убедитесь в наличии в операционной системе библиотек Visual Basic 5.0/6.0. В случае отсутствия таковых, загрузить недостающие системные файлы можно с этой страницы. [вернуться]
20 Denisыч
 
20.11.08
21:40
Да этож гений. как то я протупил...
21 Diktis
 
20.11.08
21:57
Total Commander + плагин decClipboardFS
22 Poznakomlus
 
20.11.08
22:08
когда то писал в качестве примеров для vba называлась taskpane
суть в том что сначала надо создать функциями api шаблон пустого файла(графических есть много все в msdn) а потом вставить туда картинку и записать на диск
23 Гений 1С
 
гуру
21.11.08
08:14
(19) А картинки?
24 Гений 1С
 
гуру
21.11.08
08:17
(22) Vba в отличии от vb не умеет работать с clipboard.
25 Гений 1С
 
гуру
21.11.08
08:17
(21) ПРОГРАММНО, блин!
26 sttt
 
21.11.08
09:25
27 sttt
 
21.11.08
09:27
Желающие тесты от иметь :-)))
28 sttt
 
21.11.08
09:32
Можно еще вот этим, но не пробовал:
http://www.script-coding.info/WshExtra.zip

Set WshExtra = CreateObject("WshExtra.Clipboard")
MsgBox WshExtra.Paste()
29 sttt
 
21.11.08
09:33
(26) c:\nircmd.exe clipboard saveimage "c:\temp\clip01.png"
30 sttt
 
21.11.08
09:36
(24) Если API воспользоваться то может :-)
31 sttt
 
21.11.08
09:57
(30)Private Declare Auto Function OpenClipboard Lib "User32.dll" (ByVal hWndNewOwner As Integer) As Boolean
32 sttt
 
21.11.08
10:04
33 Гений 1С
 
гуру
21.11.08
14:03
(31) в 1С Апи?
34 sttt
 
21.11.08
14:16
в Excel :-) через Оле в 1с модуль создаешь и запускаешь


=======================================================================
Перем ExcelApp;
//*********************************************************************
Процедура глУбратьМенюФайл(ExcelApp)
 ПолныйЗаголовокСистемы="1С:Предприятие - "+СокрЛП(Метаданные.Идентификатор)+": "+ЗаголовокСистемы();
 ExcelApp.DisplayAlerts = 0; // не выводить сообщений и вопросов
 WorkBook = ExcelApp.WorkBooks.Add(); // создание новой книги Excel
 WorkBook.Worksheets.Add(); // создание нового листа в книге Excel
 //добавление нового модуля VBA в книгу Excel и получение ссылки на его код:
 ы = ExcelApp.VBE.ActiveVBProject.VBComponents.Count;
 ExcelApp.VBE.ActiveVBProject.VBComponents.Add(1);
 CodeModule = ExcelApp.VBE.ActiveVBProject.VBComponents.Item(ы + 1).CodeModule;
 //************************************************************************************************
 //=>>Добавление кода VBA *************************************************************************
 //Объявления нужных Win32 API:
 CodeModule.InsertLines(1,  "Public Declare Function GetDesktopWindow Lib ""user32"" () As Long");
 CodeModule.InsertLines(2,  "Public Declare Function EnumChildWindows Lib ""user32"" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long");
 CodeModule.InsertLines(3,  "Public Declare Function GetWindowTextLength Lib ""user32"" Alias ""GetWindowTextLengthA"" (ByVal hwnd As Long) As Long");
 CodeModule.InsertLines(4,  "Public Declare Function GetWindowText Lib ""user32"" Alias ""GetWindowTextA"" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long");
 CodeModule.InsertLines(5,  "Public Declare Function GetMenu Lib ""user32"" (ByVal hwnd As Long) As Long");
 CodeModule.InsertLines(6,  "Public Declare Function GetMenuItemCount Lib ""user32"" (ByVal hMenu As Long) As Long");
 CodeModule.InsertLines(7,  "Public Declare Function RemoveMenu Lib ""user32"" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long");
 CodeModule.InsertLines(8,  "Public Declare Function GetMenuItemInfo Lib ""user32"" Alias ""GetMenuItemInfoA"" (ByVal hMenu As Long, ByVal un As Long, ByVal b As Boolean, lpmii As MENUITEMINFO) As Long");
 CodeModule.InsertLines(9,  "Public Declare Function SetTimer Lib ""user32"" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long");
 CodeModule.InsertLines(10, "Public Declare Function KillTimer Lib ""user32"" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long");
 CodeModule.InsertLines(11, "Public Declare Function DrawMenuBar Lib ""user32"" (ByVal hwnd As Long) As Long");
 //Объявления глобальных переменных, констанот и типов:
 CodeModule.InsertLines(12, "Public count_wnd As Long"); //количество найденных окон
 CodeModule.InsertLines(13, "Public hwnd_1C As Long"); //хэндл окна 1С
 CodeModule.InsertLines(14, "Public uIDEvent As Long"); //идентификатор таймера
 CodeModule.InsertLines(15, "Public Type hwnd_app"); //структура, хранящая хэндл и заголовок окна
 CodeModule.InsertLines(16, "    hwnd As Long");
 CodeModule.InsertLines(17, "    caption As String * 1024");
 CodeModule.InsertLines(18, "End Type");
 CodeModule.InsertLines(19, "Public WindowSys() As hwnd_app"); //массив, хранящий хэндлы и заголовки найденных окон
 CodeModule.InsertLines(20, "Public Type MENUITEMINFO"); //структура, хранящая информацию об элементе меню
 CodeModule.InsertLines(21, "    cbSize As Long");
 CodeModule.InsertLines(22, "    fMask As Long");
 CodeModule.InsertLines(23, "    fType As Long");
 CodeModule.InsertLines(24, "    fState As Long");
 CodeModule.InsertLines(25, "    wID As Long");
 CodeModule.InsertLines(26, "    hSubMenu As Long");
 CodeModule.InsertLines(27, "    hbmpChecked As Long");
 CodeModule.InsertLines(28, "    hbmpUnchecked As Long");
 CodeModule.InsertLines(29, "    dwItemData As Long");
 CodeModule.InsertLines(30, "    dwTypeData As String");
 CodeModule.InsertLines(31, "    cch As Long");
 CodeModule.InsertLines(32, "    hbmpItem As Long");
 CodeModule.InsertLines(33, "End Type");
 CodeModule.InsertLines(34, "Public Const MIIM_STRING = &H40");
 CodeModule.InsertLines(35, "Public Const MF_REMOVE = &H1000&");
 CodeModule.InsertLines(36, "Public Const MF_BYPOSITION = &H400");
 //Процедура, находящая хэндл окна 1С:
 CodeModule.InsertLines(37, "Public Sub Find1C_Window()");
 CodeModule.InsertLines(38, "    hwndDesktop = GetDesktopWindow()"); //получение хэндла окна рабочего стола
 CodeModule.InsertLines(39, "    EnumChildWindows hwndDesktop, AddressOf EnumChildProc, ByVal 0&"); //перечисление дочерних окон рабочего стола
 CodeModule.InsertLines(40, "    For i = 1 To count_wnd");
 CodeModule.InsertLines(41, "        If (InStr(WindowSys(i).caption, """+ПолныйЗаголовокСистемы+""") > 0) Then"); //найдено окно 1С
 CodeModule.InsertLines(42, "            hwnd_1C = WindowSys(i).hwnd"); //получение хэндла окна 1С
 CodeModule.InsertLines(43, "            Exit For");
 CodeModule.InsertLines(44, "        End If");
 CodeModule.InsertLines(45, "    Next");
 CodeModule.InsertLines(46, "End Sub");
 //Функция перечисления дочерних окон:
 CodeModule.InsertLines(47, "Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long");
 CodeModule.InsertLines(48, "    Dim sSave As String");
 CodeModule.InsertLines(49, "    sSave = Space$(GetWindowTextLength(hwnd) + 1)");
 CodeModule.InsertLines(50, "    GetWindowText hwnd, sSave, Len(sSave)"); //получение заголовка окна
 CodeModule.InsertLines(51, "    sSave = Left$(sSave, Len(sSave) - 1)");
 CodeModule.InsertLines(52, "    If sSave <> """" Then");
 CodeModule.InsertLines(53, "        count_wnd = count_wnd + 1"); //увеличение счётчика окон
 CodeModule.InsertLines(54, "        ReDim Preserve WindowSys(count_wnd)"); //помещение найденного окна в массив
 CodeModule.InsertLines(55, "        WindowSys(count_wnd).hwnd = hwnd");
 CodeModule.InsertLines(56, "        WindowSys(count_wnd).caption = sSave");
 CodeModule.InsertLines(57, "    End If");
 CodeModule.InsertLines(58, "    EnumChildProc = 1");
 CodeModule.InsertLines(59, "End Function");
 //Процедура перечисления и удаления нужных колонок меню:
 CodeModule.InsertLines(60, "Public Sub DeleteColMenu()");
 CodeModule.InsertLines(61, "    hMenu = GetMenu(hwnd_1C)"); //получение хэндла меню окна 1С
 CodeModule.InsertLines(62, "    nCnt = GetMenuItemCount(hMenu)"); //получение количества колонок меню окна 1С
 CodeModule.InsertLines(63, "    For j = nCnt - 1 To 0 Step -1"); //перечисление колонок меню
 CodeModule.InsertLines(64, "        Dim MII As MENUITEMINFO");
 CodeModule.InsertLines(65, "        MII.cbSize = Len(MII)");
 CodeModule.InsertLines(66, "        MII.fMask = MIIM_STRING");
 CodeModule.InsertLines(67, "        GetMenuItemInfo hMenu, j, True, MII"); //получение информации о пункте меню
 CodeModule.InsertLines(68, "        MII.cch = MII.cch + 100");
 CodeModule.InsertLines(69, "        MII.dwTypeData = Space(MII.cch)");
 CodeModule.InsertLines(70, "        GetMenuItemInfo hMenu, j, True, MII");
 CodeModule.InsertLines(71, "        If InStr(MII.dwTypeData, ""Файл"") > 0 Then"); //удаление меню "Файл"
 CodeModule.InsertLines(72, "            RemoveMenu hMenu, j, MF_BYPOSITION Or MF_REMOVE");
 CodeModule.InsertLines(73, "        End If");
 CodeModule.InsertLines(74, "        If InStr(MII.dwTypeData, ""Сервис"") > 0 Then"); //удаление меню "Сервис"
 CodeModule.InsertLines(75, "            RemoveMenu hMenu, j, MF_BYPOSITION Or MF_REMOVE");
 CodeModule.InsertLines(76, "        End If");
 CodeModule.InsertLines(77, "        If InStr(MII.dwTypeData, ""Окна"") > 0 Then"); //удаление меню "Окна"
 CodeModule.InsertLines(78, "            RemoveMenu hMenu, j, MF_BYPOSITION Or MF_REMOVE");
 CodeModule.InsertLines(79, "        End If");
 CodeModule.InsertLines(80, "        If InStr(MII.dwTypeData, ""Помощь"") > 0 Then"); //удаление меню "Помощь"
 CodeModule.InsertLines(81, "            RemoveMenu hMenu, j, MF_BYPOSITION Or MF_REMOVE");
 CodeModule.InsertLines(82, "        End If");
 CodeModule.InsertLines(83, "    Next");
 CodeModule.InsertLines(84, "    DrawMenuBar hwnd_1C");
 CodeModule.InsertLines(85, "End Sub");
 //Процедура запуска таймера:
 CodeModule.InsertLines(86, "Public Sub InstallTimer()");
 CodeModule.InsertLines(87, "    uIDEvent = SetTimer(0, 1000000, 50, AddressOf DeleteColMenu)");
 CodeModule.InsertLines(88, "End Sub");
 //Процедура уничтожения таймера:
 CodeModule.InsertLines(89, "Public Sub DeleteTimer()");
 CodeModule.InsertLines(90, "    KillTimer 0, uIDEvent");
 CodeModule.InsertLines(91, "End Sub");
 //<<=Добавление кода VBA *************************************************************************
 //************************************************************************************************
 ExcelApp.Application.Run("Find1C_Window"); //получение хэндла окна 1С
 ExcelApp.Application.Run("DeleteColMenu"); //удаление нужных колонок меню
 ExcelApp.Application.Run("InstallTimer"); //запуск таймера
КонецПроцедуры //глУбратьМенюФайл
35 sttt
 
21.11.08
14:18
(34) Это для v7 почти тоже самое и для v8 работает
Процедура ПриНачалеРаботыСистемы()
 Попытка
   ExcelApp = СоздатьОбъект("Excel.Application");
   глУбратьМенюФайл(ExcelApp);
 Исключение
   Предупреждение("Не удалось запустить MS Excel!");
   СтатусВозврата(0);
   Возврат;
 КонецПопытки;
КонецПроцедуры // ПриНачалеРаботыСистемы
//************************************************************************************************
Процедура ПриЗавершенииРаботыСистемы()
 ExcelApp.Application.Run("DeleteTimer");
 ExcelApp.DisplayAlerts=0;
 ExcelApp.Quit();
 ExcelApp="";
КонецПроцедуры // ПриЗавершенииРаботыСистемы
36 sttt
 
21.11.08
14:27
взято отсюда Удалить меню "Файл"
37 sttt
 
21.11.08
19:22
Option Explicit
Sub test()
   Dim oChart As ChartObject, oPic As Picture, w As Long, h As Long, FileName As String
   FileName = ThisWorkbook.Path & "\Test.jpg"
   Application.ScreenUpdating = False
   With ActiveSheet
       Set oPic = .Pictures.Insert("C:\temp\Test.jpg")
       With oPic
           .Height = 175 * (.Height / .Width)
           .Width = 175
           w = .Width
           h = .Height
           .Copy
       End With
       Set oChart = .ChartObjects.Add(10, 10, w, h)
       With oChart.Chart
           .Paste
           .ChartArea.Border.LineStyle = 0
           .ChartArea.ClearContents
           .Export FileName, "JPEG", False
       End With
   End With
   oPic.Delete
   oChart.Delete
   Application.CutCopyMode = False
   Application.ScreenUpdating = True
End Sub
38 sttt
 
21.11.08
19:23
Option Explicit

'---------------- Описания структур, функций, констант Win32 API ---------------

Private Type Bitmap '24 bytes
  bmType As Long
  bmWidth As Long
  bmHeight As Long
  bmWidthBytes As Long
  bmPlanes As Integer
  bmBitsPixel As Integer
  bmBits As Long
End Type

Private Declare Function SelectObject Lib "gdi32" ( _
  ByVal hDC As Long, ByVal hObject As Long) As Long
'Private Declare Function DeleteObject Lib "gdi32" ( _
  ByVal hObject As Long) As Long
Private Declare Function GetObjectA Lib "gdi32" ( _
  ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long

Private Declare Function GetObjectType Lib "gdi32" ( _
  ByVal hgdiobj As Long) As Long
Private Const OBJ_BITMAP = 7

Private Declare Function CreateCompatibleDC Lib "gdi32" ( _
  ByVal hDC As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" ( _
  ByVal hDC As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32" ( _
  ByVal hDC As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long

Private Declare Function SetStretchBltMode Lib "gdi32" ( _
  ByVal hDC As Long, ByVal nStretchMode As Long) As Long
Private Const STRETCH_DELETESCANS = 3
Private Const STRETCH_HALFTONE = 4

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
Private Const SRCCOPY = &HCC0020 ' (DWORD) dest = source

Private Const PICTYPE_BITMAP = 1

Private Type PicBmp
  Size As Long
  Type As Long
  hBmp As Long
  hPal As Long
  Reserved As Long
End Type

Private Type GUID
  Data1 As Long
  Data2 As Integer
  Data3 As Integer
  Data4(7) As Byte
End Type

Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" ( _
  PicDesc As PicBmp, RefIID As GUID, _
  ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long

'-------------------------------------------------------------------------------

'Из Q161299
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' CreateBitmapPicture
'    - Creates a bitmap type Picture object from a bitmap and
'      palette.
'
' hBmp
'    - Handle to a bitmap.
'
' hPal
'    - Handle to a Palette.
'    - Can be null if the bitmap doesn't use a palette.
'
' Returns
'    - Returns a Picture object containing the bitmap.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function CreateBitmapPicture( _
  ByVal hBmp As Long, ByVal hPal As Long) As StdPicture
Dim R As Long
Dim Pic As PicBmp
' IPicture requires a reference to "Standard OLE Types."
Dim IPic As IPicture
Dim IID_IDispatch As GUID

' Fill in with IDispatch Interface ID.
With IID_IDispatch
   .Data1 = &H20400
   .Data4(0) = &HC0
   .Data4(7) = &H46
End With

' Fill Pic with necessary parts.
With Pic
   .Size = Len(Pic)          ' Length of structure.
   .Type = PICTYPE_BITMAP    ' Type of Picture (bitmap).
   .hBmp = hBmp              ' Handle to bitmap.
   .hPal = hPal              ' Handle to palette (may be null).
End With

' Create Picture object.
R = OleCreatePictureIndirect(Pic, IID_IDispatch, 1, IPic)

' Return the new Picture object.
Set CreateBitmapPicture = IPic
End Function


Public Function FitToSizeBitmap( _
  ByVal hBitmap As Long, _
  Optional ByVal nWidth As Long = 0, _
  Optional ByVal nHeight As Long = 0) As StdPicture
Dim bm As Bitmap
Dim cbSize As Long
Dim cbCopied As Long
Dim hdcSrc As Long
Dim hdcDst As Long
Dim hbmpOldSrc As Long
Dim hbmpOldDst As Long
Dim hbmpNew As Long
Dim r0 As Double
Dim nDstWidth As Long, nDstHeight As Long

If (hBitmap = 0) Or (nWidth < 0) Or (nHeight < 0) Then Exit Function
If GetObjectType(hBitmap) <> OBJ_BITMAP Then Exit Function

'Получаем заголовок битмапа, чтобы извлечь из него размеры изображения
'в пикселях
cbSize = LenB(bm)
cbCopied = GetObjectA(hBitmap, cbSize, bm)
If cbCopied <> cbSize Then Exit Function

'Подгонка размера
r0 = bm.bmWidth / bm.bmHeight
If nWidth = 0 Then
   'Пользователя не интересует ширина - вписываем в высоту
   If nHeight = 0 Then
      'Пользователя не интересует и высота - странно. Просто
      'сохраняем оригинальные размеры
      nDstWidth = bm.bmWidth
      nDstHeight = bm.bmHeight
   Else
      nDstHeight = nHeight
      nDstWidth = Int(nDstHeight * r0 + 0.5)
      If nDstWidth <= 0 Then nDstWidth = 1
   End If
ElseIf nHeight = 0 Then
   'Пользователя не интересует высота - вписываем в ширину
   nDstWidth = nWidth
   nDstHeight = Int(nDstWidth / r0 + 0.5)
   If nDstHeight <= 0 Then nDstHeight = 1
Else
   'Пользователь хочет вписать битмап в прямоугольник с размерами
   'не больше заданных
   If r0 < nWidth / nHeight Then
      nDstHeight = nHeight
      nDstWidth = Int(nHeight * r0 + 0.5)
      If nDstWidth <= 0 Then nDstWidth = 1
   Else
      nDstWidth = nWidth
      nDstHeight = Int(nHeight / r0 + 0.5)
      If nDstHeight <= 0 Then nDstHeight = 1
   End If
End If

'Создаём контексты устройств, совместимых с экраном, в памяти
'Картинка будет иметь логическое разрешение, как у экрана (обычно 96 dpi)
hdcSrc = CreateCompatibleDC(0)
hdcDst = CreateCompatibleDC(hdcSrc)

'Создаём битмап, совместимый с оригинальным, в памяти
hbmpOldSrc = SelectObject(hdcSrc, hBitmap)
hbmpNew = CreateCompatibleBitmap(hdcSrc, nDstWidth, nDstHeight)
If hbmpNew = 0 Then
   SelectObject hdcSrc, hbmpOldSrc
   DeleteDC hdcDst
   DeleteDC hdcSrc
   Exit Function
End If
hbmpOldDst = SelectObject(hdcDst, hbmpNew)

'Отрисовываем оригинальный битмап на целевой с перемасштабированием
SetStretchBltMode hdcDst, STRETCH_HALFTONE 'Есть только в ОС с ядром NT
StretchBlt hdcDst, 0, 0, nDstWidth, nDstHeight, _
           hdcSrc, 0, 0, bm.bmWidth, bm.bmHeight, SRCCOPY

'Создаём StdPicture, владеющий битмапом
Set FitToSizeBitmap = CreateBitmapPicture(hbmpNew, 0)

'Очищаем объекты GDI
SelectObject hdcSrc, hbmpOldSrc
SelectObject hdcDst, hbmpOldDst
'DeleteObject hbmpNew 'Третий параметр OleCreatePictureIndirect,
                     'установленний в TRUE, заставляет убивать битмап
                     'при уменьшении счётчика ссылок на картинку до нуля
DeleteDC hdcDst
DeleteDC hdcSrc
End Function
Это модуль с функцией FitToSizeBitmap(), перемасштабирующей битмап с сохранением пропорций. Желательно выполнять на ОС с ядром NT (NT 4.0, 2000, XP, 2003, Vista). В случае 95/98/Me режима STRETCH_HALFTONE нет (согласно документации - не проверял), придётся пользоваться STRETCH_DELETESCANS, он чуть менее качественный.
Пример использования:

Public Sub Test()
Dim SrcPic As StdPicture, DstPic As StdPicture
Set SrcPic = LoadPicture("C:\test.jpg")
Set DstPic = FitToSizeBitmap(SrcPic.Handle, 175)
SavePicture DstPic, "C:\test1.bmp"
End Sub
Для записи в JPEG требуется, чтобы была установлена библиотека GDI+. Она входит в ОС начиная с XP, для более ранних доступна с сайта MS (1МБ). Наличие на компьютере можно проверить поиском файла GdiPlus.dll.

Option Explicit

Private Type GdiplusStartupInput
  GdiplusVersion           As Long
  DebugEventCallback       As Long
  SuppressBackgroundThread As Long
  SuppressExternalCodecs   As Long
End Type

Private Type CLSID 'частный вид GUID-а
  Data1         As Long
  Data2         As Integer
  Data3         As Integer
  Data4(0 To 7) As Byte
End Type

Private Enum EncoderParameterValueType
  [EncoderParameterValueTypeByte] = 1
  [EncoderParameterValueTypeASCII] = 2
  [EncoderParameterValueTypeShort] = 3
  [EncoderParameterValueTypeLong] = 4
  [EncoderParameterValueTypeRational] = 5
  [EncoderParameterValueTypeLongRange] = 6
  [EncoderParameterValueTypeUndefined] = 7
  [EncoderParameterValueTypeRationalRange] = 8
End Enum

Private Type EncoderParameter
  GUID           As CLSID
  NumberOfValues As Long
  Type           As EncoderParameterValueType
  Value          As Long
End Type

Private Type EncoderParameters
  Count     As Long
  Parameter As EncoderParameter
End Type

Private Enum GpStatus
  [OK] = 0
  [GenericError] = 1
  [InvalidParameter] = 2
  [OutOfMemory] = 3
  [ObjectBusy] = 4
  [InsufficientBuffer] = 5
  [NotImplemented] = 6
  [Win32Error] = 7
  [WrongState] = 8
  [Aborted] = 9
  [FileNotFound] = 10
  [ValueOverflow] = 11
  [AccessDenied] = 12
  [UnknownImageFormat] = 13
  [FontFamilyNotFound] = 14
  [FontStyleNotFound] = 15
  [NotTrueTypeFont] = 16
  [UnsupportedGdiplusVersion] = 17
  [GdiplusNotInitialized] = 18
  [PropertyNotFound] = 19
  [PropertyNotSupported] = 20
End Enum
Private Type ImageCodecInfo
  ClassID           As CLSID
  FormatID          As CLSID
  CodecName         As Long
  DllName           As Long
  FormatDescription As Long
  FilenameExtension As Long
  MimeType          As Long
  flags             As Long
  Version           As Long
  SigCount          As Long
  SigSize           As Long
  SigPattern        As Long
  SigMask           As Long
End Type

Private Declare Function GdipCreateBitmapFromHBITMAP Lib "gdiplus" ( _
  ByVal hBmp As Long, ByVal hPal As Long, Bitmap As Long) As GpStatus
Private Declare Function GdiplusStartup Lib "gdiplus" ( _
  token As Long, inputbuf As GdiplusStartupInput, _
  Optional ByVal outputbuf As Long = 0) As GpStatus
Private Declare Function GdiplusShutdown Lib "gdiplus" ( _
  ByVal token As Long) As GpStatus
Private Declare Function GdipSaveImageToFile Lib "gdiplus" ( _
  ByVal image As Long, ByVal FileNameW As Long, _
  clsidEncoder As CLSID, encoderParams As Any) As GpStatus
Private Declare Function GdipGetImageEncodersSize Lib "gdiplus" ( _
  numEncoders As Long, Size As Long) As GpStatus
Private Declare Function GdipGetImageEncoders Lib "gdiplus" ( _
  ByVal numEncoders As Long, ByVal Size As Long, encoders As Any) As GpStatus
Private Declare Function GdipDisposeImage Lib "gdiplus" ( _
  ByVal image As Long) As GpStatus

Private Declare Function CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  Dest As Any, Src As Any, ByVal cb As Long) As Long
'Private Declare Function CLSIDFromString Lib "ole32" ( _
  ByVal lpszProgID As Long, pCLSID As CLSID) As Long
Private Declare Function lstrlenW Lib "kernel32" ( _
  ByVal psString As Any) As Long

'Private Const EncoderQuality$ = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Private GdIHandle As Long

Public Function SavePictureToJPEG( _
  Picture As StdPicture, FileName As String, JPGQuality As Long) As Boolean
Dim gplRet      As Long
Dim hImg        As Long
Dim uEncCLSID   As CLSID
Dim uEncParams  As EncoderParameters

Dim GpInput As GdiplusStartupInput
GpInput.GdiplusVersion = 1
If GdiplusStartup(GdIHandle, GpInput) <> [OK] Then Exit Function
If JPGQuality > 100 Then JPGQuality = 100
If JPGQuality < 1 Then JPGQuality = 1

'-- Create bitmap from HBITMAP
gplRet = GdipCreateBitmapFromHBITMAP(Picture.Handle, Picture.hPal, hImg)
If gplRet = [OK] Then
   
   GetEncoderClsID "image/jpeg", uEncCLSID
   'Установка качества
   uEncParams.Count = 1
   With uEncParams.Parameter
      .NumberOfValues = 1
      .Type = [EncoderParameterValueTypeLong]
      With .GUID
         .Data1 = &H1D5BE4B5
         .Data2 = &HFA4A
         .Data3 = &H452D
         .Data4(0) = &H9C
         .Data4(1) = &HDD
         .Data4(2) = &H5D
         .Data4(3) = &HB3
         .Data4(4) = &H51
         .Data4(5) = &H5
         .Data4(6) = &HE7
         .Data4(7) = &HEB
      End With
      'CLSIDFromString StrPtr(EncoderQuality), .GUID
      .Value = VarPtr(JPGQuality)
   End With
   gplRet = GdipSaveImageToFile(hImg, StrPtr(FileName), uEncCLSID, uEncParams)
   SavePictureToJPEG = gplRet = [OK]
   gplRet = GdipDisposeImage(hImg)
End If

GdiplusShutdown GdIHandle
End Function

Private Function GetEncoderClsID(strMimeType As String, ClassID As CLSID)
Dim Num As Long, Size As Long, i As Long
Dim ICI()    As ImageCodecInfo
Dim Buffer() As Byte

GetEncoderClsID = -1
GdipGetImageEncodersSize Num, Size
If Size = 0 Then Exit Function
ReDim ICI(1 To Num) As ImageCodecInfo
ReDim Buffer(1 To Size) As Byte
GdipGetImageEncoders Num, Size, Buffer(1)
CopyMemory ICI(1), Buffer(1), (Len(ICI(1)) * Num)
For i = 1 To Num
   If StrComp(LPWSTR2String(ICI(i).MimeType), strMimeType, _
              vbTextCompare) = 0 Then
      ClassID = ICI(i).ClassID
      GetEncoderClsID = i
      Exit For
   End If
Next
Erase ICI
Erase Buffer
End Function

Private Function LPWSTR2String(ByVal lpWStr As Long) As String
Dim nStrLen As Long
nStrLen = lstrlenW(lpWStr)
LPWSTR2String = String$(nStrLen, vbNullChar)
CopyMemory ByVal StrPtr(LPWSTR2String), ByVal lpWStr, nStrLen * 2
End Function
Это модуль с функцией SavePictureToJPEG(). Пример использования:

Public Sub Test()
Dim SrcPic As StdPicture, DstPic As StdPicture
Set SrcPic = LoadPicture("C:\test.jpg")
Set DstPic = FitToSizeBitmap(SrcPic.Handle, 175)
SavePicture DstPic, "C:\test1.bmp"
SavePictureToJPEG  DstPic, "C:\test1.jpg", 80
Set DstPic = FitToSizeBitmap(SrcPic.Handle, 75)
SavePicture DstPic, "C:\test2.bmp"
SavePictureToJPEG  DstPic, "C:\test2.jpg", 80
End Sub
39 Гений 1С
 
гуру
21.11.08
20:53
Блин, офигеть. Конкретное удаление гланд через п..у.
Если бы я хотел через офис взять, я бы вставил из буфера в ворд, а потом бы выделил все и скопипастил в HTML, Там была бы ссылка на временный файл, куда она положила картинку. Но на компе может не быть ворда.
Закон Брукера: Даже маленькая практика стоит большой теории.