Для меня работа с картинками, в TRichView не была очевидна, поэтому пару дней пришлось поразбираться с тонкостями и нюансами. Мне был интересен аспект сохранения картинок при экспорте в HTML формат (например, методы SaveHTMLEx и SaveHTMLToStreamEx).
В данном посте предлагается решение, которое будет нумеровать картинки с определенным префиксом и сохранять их в определенную папку. То есть, можно будет брать из базы максимальный номер последней добавленной картинки перед сохранением, и начинать с него.
Я также пробовал искать возможность сохранения картинки “как есть”, то есть имя + расширение, например, FileName.gif, но пока до конца не разобрался. Вот здесь находится полезный пост на эту тему. В принципе, я даже написал тестовый код, но проблема в том, что я не знал, в какой момент его нужно добавить, по идее, в момент If OpenDialog.execute…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
procedure TMainForm.bTestClick(Sender: TObject); var FileName: string; Local_i: Integer; begin //Запоминаем имена вставленных картинок for Local_i := 0 to RichViewEdit1.ItemCount-1 do begin //Сохранение имени файла if RichViewEdit1.GetItem(Local_i).StyleNo=rvsPicture then RichViewEdit1.GetItem(Local_i).SetExtraStrProperty(rvespImageFileName,'SomeFileName'); //Чтение имени файла RichViewEdit1.GetItem(Local_i).GetExtraStrProperty(rvespImageFileName,FileName); ShowMessage(FileName); end; end; |
По умолчанию, если ничего не поменять, при сохранении документа, картинки конвертируются в jpg и сохраняются просто под номерами 1.jpg,2.jpg,3.jpg и так далее… Если почитать справку, то получим следующее
By default:
Images are saved in separate files as Jpegs (or as bitmaps for Delphi2, or if RVDONOTUSEJPEGIMAGE is defined) and have names composed as ImagesPrefix + Number + ‘.jpg’, where
▪ ImagesPrefix – parameter of SaveHTML/SaveHTMLEx;
▪ Number – some number making this file name unique (image files can override existing ones or not, depending on parameters of SaveHTML/SaveHTMLEx). Bullets and hotspots items having the same image list, image index and background color are saved in the same file (the same is for list markers).
Если ничего более не нужно как файлы картинок, рядом с html файлом, то можно на этом и остановиться. Но мне было нужно, чтобы gif, например, были как gif, png как png, и чтобы я мог сохранять изображения в определенную папку, а в документе прописывать правильные пути к ним.
О том, как включить в TrichView поддержку анимированных gif файлов я писал в отдельной статье. Но это частный случай, здесь же мы создадим более менее универсальное решение.
Сохранение картинок в выбранной директории при помощи процедуры OnSaveImage2
Для начала нам нужно само сохранение, пусть оно будет в некотором методе и будет выглядеть следующим образом
1 2 3 |
... RichViewEdit1.SaveHTMLToStreamEx(MS, 'DirectoryToSavePics', 'MyTitle', 'ImgPrefix', '', '', '', []); ... |
Обратите внимание, здесь мы указали префикс ImgPrefix.
Также нам понадобится вспомогательная процедура создания директории для сохранения картинок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TMainForm.CreatePicsDirectory(var DirectoryToSavePics: string); begin // Директория для сохранения картинок DirectoryToSavePics := ExtractFileDir(Application.ExeName); DirectoryToSavePics := DirectoryToSavePics + '\files\pics\'; // Создаем директорию, если не существовала if not TDirectory.Exists(DirectoryToSavePics) then begin try TDirectory.CreateDirectory(DirectoryToSavePics); except on E: Exception do showmessage(E.ClassName + ' поднята ошибка, с сообщением : ' + E.Message); end; end; end; |
И, наконец сама процедура сохранения картинок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//-------------Сохранение картинок при экспорте в HTML procedure TMainForm.SaveImage2(Sender: TCustomRichView; Graphic: TGraphic; SaveFormat: TRVSaveFormat; const Path, ImagePrefix: String; var ImageSaveNo: Integer; var Location: String; var DoDefault: Boolean); var DirectoryToSavePics: string; gr:TGraphic; FileName: string; RandomNumber: Integer; begin if SaveFormat <> rvsfHTML then exit; CreatePicsDirectory(DirectoryToSavePics); //Формируем имя файла FileName:=Format(ImagePrefix + '%d.%s', [ImageSaveNo, GraphicExtension(TGraphicClass(Graphic.ClassType))]); //Формируем строку для отображения картинок в HTML документе Location:=DirectoryToSavePics+FileName; // Непосредственное сохранение Graphic.SaveToFile(Location); //Оставляем относительный путь (если документ будет в соответствующей директории) Location:='files/pics/'+Format(ImagePrefix + '%d.%s', [ImageSaveNo, GraphicExtension(TGraphicClass(Graphic.ClassType))]); inc(ImageSaveNo); DoDefault := False; end; |
Тестируем код
Загрузим пару изображений, сохраним и откроем их в браузере
В базе данных картинки сохранились следующим образом
1 |
<p><img alt="" src="files/pics/ImgPrefix0.png">SomeText<img alt="" src="files/pics/ImgPrefix1.jpg"></p> |