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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2011, 20:56   #1
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию Копирование картинки

У меня есть программа которая создаёт HTML отчёт. Картинка загружается в Image такой процедурой:
Код:
procedure TMainForm.ButtonLoadImageClick(Sender: TObject);
begin
  if(OpenPictureDialog.Execute) then
    Image.Picture.LoadFromFile(OpenPictureDialog.FileName);
end;
Затем у меня начинает генерироваться HTML файл:
Код:
procedure TMainForm.HTMLClick(Sender: TObject);
var
  HTMLStr: TStringList;
  i, j: Integer;
  E: Exception;
begin
  try
    HTMLStr := TstringList.Create;
    HTMLStr.Clear;
    HTMLStr.Add('<html>');
    HTMLStr.Add('<head>');
    HTMLStr.Add('<title>'+'Название'+'</title>');
    HTMLStr.Add('</head>');
    //перед этим нужно узнать имя картинки и её расширение
    HTMLStr.Add('<src img = img/temp.jpg>'); //просто пример вставки картинки, где temp.jpg - исходное имя и расширение
    HTMLStr.Add('</body>');
    HTMLStr.Add('</html>');
    try
      if SaveDialog.Execute then
        begin
          HTMLStr.SaveToFile(SaveDialog.FileName);
        end;
    except
      ShowMessage('Ошибка записи результатов в файл!');
    end;
    HTMLStr.Free;
    ShellExecute(Handle, 'open', pchar(SaveDialog.FileName), '', '', sw_ShowNormal);
  except
    on EExternal do OnErrorDo(E);
  end;
end;
Вопрос такой, как мне программно по пути сохранения файла создать рядом с ним папку "img" и поместить в него исходную выбранную картинку, для того чтобы тег работал, и как узнать имя картинки для прописывания тега? То есть, это функция создания папки и копирования в неё картинки должна располагаться в теле этого кода:
Код:
if SaveDialog.Execute then
        begin
          HTMLStr.SaveToFile(SaveDialog.FileName);
          //создание папки и копирование в неё картинки
        end;
iKarma вне форума Ответить с цитированием
Старый 29.11.2011, 22:02   #2
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

примерно так
Код:
if SaveDialog.Execute then
        begin
          HTMLStr.SaveToFile(SaveDialog.FileName);
          //создание папки
if not  DirectoryExists(ExtractFilePath(SaveDialog.FileName)+'img') then
  mkdir(ExtractFilePath(SaveDialog.FileName)+'img');       

//и копирование в неё картинки
Image1.Picture.SaveToFile(ExtractFilePath(SaveDialog.FileName)+'img\1.jpg')
 end;
если картинка может быть не только jpg, а png или bmp, то можно преобразовать в jpg к примеру


PS
если надо именно копировать картинку, то имя файла при загрузке можно сохранять в глобальной переменной.

Код:
var
form:TMainForm;
fl_nm:string;
................
procedure TMainForm.ButtonLoadImageClick(Sender: TObject);
begin
  if(OpenPictureDialog.Execute) then
begin
    Image.Picture.LoadFromFile(OpenPictureDialog.FileName);
   fl_nm:=OpenPictureDialog.FileName;
end;
end;
А потом значение этой переманной использовать
Код:
procedure TMainForm.HTMLClick(Sender: TObject);
var
  HTMLStr: TStringList;
  i, j: Integer;
  E: Exception;
begin
  try
    HTMLStr := TstringList.Create;
    HTMLStr.Clear;
    HTMLStr.Add('<html>');
    HTMLStr.Add('<head>');
    HTMLStr.Add('<title>'+'Название'+'</title>');
    HTMLStr.Add('</head>');
     HTMLStr.Add('<body>'); 

    HTMLStr.Add('<img src = img/'+ExtractFileName(fl_nm)+'>'); //используем
    HTMLStr.Add('</body>');
    HTMLStr.Add('</html>');
    try
      if SaveDialog.Execute then
        begin
          HTMLStr.SaveToFile(SaveDialog.FileName);
         if not  DirectoryExists(ExtractFilePath(SaveDialog.FileName)+'img') then
        mkdir(ExtractFilePath(SaveDialog.FileName)+'img');            
      CopyFile(pwidechar(fl_nm), pwidechar(ExtractFilePath(SaveDialog.FileName)+'img\'+ExtractFileName(fl_nm)), true)// копируем
        end;
    except
      ShowMessage('Ошибка записи результатов в файл!');
    end;
    HTMLStr.Free;
    ShellExecute(Handle, 'open', pchar(SaveDialog.FileName), '', '', sw_ShowNormal);
  except
    on EExternal do OnErrorDo(E);
  end;
end;
смысл я думаю понятен, остальное можно доработать

Последний раз редактировалось vovk; 29.11.2011 в 23:49.
vovk вне форума Ответить с цитированием
Старый 30.11.2011, 10:35   #3
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

Спасибо, доработал под себя =)
iKarma вне форума Ответить с цитированием
Старый 30.11.2011, 10:58   #4
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

А как проверить, что в Image есть картинка, в противном случае не выводился бы тег
Код:
HTMLStr.Add('<p align="center"><img src=Data/Avatar'+ImageExt+' height=50% weight=50%></p>');
Пытался сделать так, но нет реакции:
Код:
ImagePath := ExtractFilePath(OpenPictureDialog.FileName) + ExtractFileName(OpenPictureDialog.FileName);
if ImagePath <> Null then
      HTMLStr.Add('<p align="center"><img src=Data/Avatar'+ImageExt+' height=50% weight=50%></p>');
iKarma вне форума Ответить с цитированием
Старый 30.11.2011, 12:30   #5
vovk
!=
Участник клуба
 
Аватар для vovk
 
Регистрация: 08.09.2008
Сообщений: 1,751
По умолчанию

предлагаю проверять к примеру ширину
Код:
if (Image1.Picture.Width=0) then
так как тип изображения может быть разным и проверка
Код:
Image1.Picture.Graphic.Empty
и
Код:
Image1.Picture.Bitmap.Empty
может быть затруднена, ну не то что затруднена, а немного сложноватой, к примеру проверка Image1.Picture.Graphic.Empty на пустом image, вызовет исключение, но после проверки Image1.Picture.Bitmap.Empty пройдёт нормально.
И ещё при обращение к Graphic и Bitmap приводит к тому, что image попытается отобразить содержимое того к чему обращаемся. в общем проверка может быть сложной.

Либо после загрузки конвертировать изображение к примеру в jpg и его перегружать в Image.
А уже когда точно знаем что содержится, легко проверить наличие, и сохранить можно уже загруженное изображение с изменением свойств (если требуется).

Возможно есть другие более правильные способы, но я их не знаю.

Последний раз редактировалось vovk; 30.11.2011 в 14:15.
vovk вне форума Ответить с цитированием
Старый 30.11.2011, 14:10   #6
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

благодарствую, как раз проверка на высоту и ширину подходит.
з.ы.: к сожалению почему-то не могу повысить вам репутацию - как только можно будет, так сразу)
iKarma вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отображение картинки на кнопке WPF. Загрузка картинки из ресурсов. Проблема с Uri. Casper-SC Общие вопросы .NET 0 27.06.2010 23:11
Картинки vassabi Microsoft Office Excel 1 20.09.2009 23:35
Копирование картинки из DOS DJ_SAN Паскаль, Turbo Pascal, PascalABC.NET 8 17.03.2009 03:36
Размер Image изменяется на размер картинки, а сама она рисуется на области первой картинки RPGer Мультимедиа в Delphi 6 20.10.2008 19:54
Картинки Rio309 Мультимедиа в Delphi 4 10.02.2008 00:36