Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2010, 09:51   #1
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
Вопрос Ошибка чтения сохранённого файла(картинки)

Специалисты по работе с картинками! Что не так?
Скомпоновал из разных примеров в одну кучу.
Изначально была задача сохранить выделенное в файл.
Потом добавил, что б и на форму кидало:
Код:
Private Declare Function OpenClipboard Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function CloseClipboard Lib "user32.dll" () As Long
Private Declare Function GetClipboardData Lib "user32.dll" (ByVal wFormat As Long) As Long
Private Declare Function CopyEnhMetaFile Lib "gdi32" Alias "CopyEnhMetaFileA" (ByVal hemfSrc As Long, ByVal lpszFile As String) As Long
 
Const CF_ENHMETAFILE As Long = 14
 Private Sub CommandButton1_Click()
 Dim PShape As Shape, hStrPtr As Long
   Range("F1:Q41").Select
    Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
 
    If Not CBool(OpenClipboard(0)) Then
      MsgBox "Не удалось открыть буфер"
      GoTo NextSh
    End If
    hStrPtr = GetClipboardData(CF_ENHMETAFILE)
    If Not CBool(hStrPtr) Then
      MsgBox "Не удалось получить дескриптор"
      GoTo CloseClip
    End If
    If Not CBool(CopyEnhMetaFile(hStrPtr, "C:\Temp" & hStrPtr & ".jpg")) Then
        MsgBox "Не удалось создать файл"
            Else
   UserForm1.Image1.Picture = LoadPicture("C:\Temp" & hStrPtr & ".jpg")
    UserForm1.Image1.PictureSizeMode = 1
      GoTo CloseClip
    End If
CloseClip:
    CloseClipboard
End Sub
В итоге имею: Файл на диске. Картинку на форме(нормальная)
Картинка по коду взята из файла. Это я сделал для контроля.
Но клик по картинке вызывает ошибку у XnView: Не знает, видите ли, как читать.
Открыть с помощью Paint - открывает, но почему-то на чёрном фоне.
Открыть с помощью Программы просмотра факсов и изображений - всё ОК
Пытаюсь здесь же сохранить как новое изображение. XnView начинает открывать но как и Paint на чёрном фоне
Даже когда пытаюсь сохранить с формы:
Код:
Private Sub CommandButton2_Click()
SavePicture Image1.Picture, "C:\" & Replace(Time, ":", "_") & ".jpg"
End Sub
Та же петрушка
Расширение менял на bmp - не помогает
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.10.2010, 11:53   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Тут не всё так просто...
Подобным кодом вы сохраните файл в формате BMP или EMF
(и пофиг, какое расширение вы дадите файлу - Windows и большинство графических программ не обращают внимания на расширения файлов-картинок, автоматически распознавая тип содержимого)

Если картинка черная, но формат BMP вас устраивает, - то можно не усложнять код.
Возможно, надо будет поменять параметры в строке Selection.CopyPicture Appearance:=xlScreen, Format:=xlPicture
и добавить в код DoEvents или application.screenupdating=TRUE
(при отключенном обновлении экрана картинки не копируются нормально!)

Чтобы сохранить картинку в JPG, код должен быть немного сложнее.
Нужный вам код (с примером) есть здесь: http://www.planetaexcel.ru/forum.php?thread_id=13885
Прямая ссылка на файл примера: http://excelvba.ru/XL_Files/Sample__...__15-58-27.zip

Последний раз редактировалось EducatedFool; 28.10.2010 в 12:05.
EducatedFool вне форума Ответить с цитированием
Старый 28.10.2010, 12:54   #3
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Картинка цветная. bmp устраивает.
почему тогда не срабатывает правильно сохранение из формы:
Код:
SavePicture Image1.Picture, "C:\Temp\" & Replace(Time, ":", "_") & ".bmp"
Если после открытия формы открываю Paint и делаю Правка вставить вставляет правильно(в буфере же осталась).
Может имеет смысл просто программно открыть Paint, вставить и, если возможно такое, сохранить как и закрыть.
А то сохранять в jpg слишком усложняется код. Я думаю для меня это не обосновано.
Спасибо за пример. Сохранил. Может в другое время и использую
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.10.2010, 13:03   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Может имеет смысл просто программно открыть Paint, вставить и, если возможно такое, сохранить как и закрыть.
Не сказал бы, что такой вариант можно назвать стабильным.
Использование внешних программ имеет смысл применять только в крайнем случае.

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

Цитата:
почему тогда не срабатывает правильно сохранение из формы
Вот тут не знаю... код простейший, должен работать нормально.
Где пример файла с формой и этим кодом, который работает некорректно?
EducatedFool вне форума Ответить с цитированием
Старый 28.10.2010, 13:19   #5
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Вот. Кнопочка сохранить вызывает форму
Вложения
Тип файла: rar Рисование линий.rar (69.3 Кб, 11 просмотров)
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.10.2010, 13:51   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Кнопочка сохранить вызывает форму
Которая? на листе, или на форме?

У меня всё работает без ошибок
(только убрал из References ссылку на отсутствующий у меня Project1)

При первом запуске вылетала ошибка - "не могу очистить буфер обмена"
Повторно воспроизвести эту ошибку не удалось.

Цитата:
SavePicture Image1.Picture, "C:\Temp\" & Replace(Time, ":", "_") & ".jpg"
SavePicture Image1.Picture, "C:\Temp\" & Replace(Time, ":", "_") & ".bmp"
SavePicture Image1.Picture, "C:\Temp\" & Replace(Time, ":", "_") & ".tif"
Нафига 3 разных расширения???
Файл-то один, и для Windows между этими файлами разницы нет.
EducatedFool вне форума Ответить с цитированием
Старый 28.10.2010, 14:05   #7
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Пробовал. Думал может что изменится.
А у меня только Программа просмотра факсов и изображений смотрит нормально.
А для просмотра графики по умолчанию установлен XnView
Что за Глюк может быть?
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.10.2010, 14:14   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
А для просмотра графики по умолчанию установлен XnView
Есть намного более удобная прога для просмотра картинок: FastStone Image Viewer
Могу скинуть на почту, если надо.
EducatedFool вне форума Ответить с цитированием
Старый 28.10.2010, 14:38   #9
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

Если интерфейс русский.
А то у меня с буржуйским напряг...
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Старый 28.10.2010, 14:39   #10
alex77755
Форумчанин
 
Аватар для alex77755
 
Регистрация: 14.02.2009
Сообщений: 753
По умолчанию

В принципе я уже скачиваю сам
помогу решить контрольные VB6, VBA (недорого)
Alex77755@mail.ru
alex77755 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка чтения файла Umnik1 Общие вопросы Delphi 12 25.06.2013 22:57
Ошибка в коде чтения rezak91 Помощь студентам 6 25.05.2010 21:03
Ошибка: Попытка чтения за концом файла PlayHard Помощь студентам 11 10.05.2010 22:51
Ошибка чтения из памяти Шульц Общие вопросы Delphi 20 03.11.2009 12:26
ошибка чтения KiSH333 БД в Delphi 12 22.08.2008 11:09