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

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

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2010, 09:21   #1
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию Пропорциональное изменение jpg-файлов средствам Borland С++ Builder

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

*********************************** *******************
Код:
double W,H;
AnsiString a  = GetCurrentDir();// Так-как в дальнейшем путь изменится сохраним его
if(OpenPictureDialog1->Execute())// Выбираем картинку
  {
   TRect rect,rim;
   TPicture *P = new TPicture;// Создаём объект изображения
   TJPEGImage *jpg = new TJPEGImage();// Создаём Объект файла .jpg
   TImage *img  = new TImage(Application);// Создаём образ картинки
    P->LoadFromFile(OpenPictureDialog1->FileName);// Загружаем картинку
    // Левый верхний угол картинки
    rect.Left = 0;
    rect.Top = 0;
    // Правый нижний угол картинки
    W = P->Width;
    H = P->Height;
    if(W > H)// Ширина больше высоты
      {
      rect.Bottom = H / W * 320;
      rect.Right = 320;
      }
    else     // Ширина меньше высоты
      {
      rect.Right = W / H * 240;
      rect.Bottom = 240;
      }
    // Это, если нужно выводить на экран, картинку меньшего размера чем в файл
    rim = rect;
    rim.Bottom /= 2;
    rim.Right /= 2;
    // Отображение высоты и ширины картинки в файле
    Label1->Caption = "Высота картинки - " + IntToStr(rect.Bottom);
    Label2->Caption = "Ширина картинки - " + IntToStr(rect.Right);
    // Задаём Размеры картинки для файла
    img->Width = rect.Right;
    img->Height = rect.Bottom;

    img->Canvas->StretchDraw(rect,P->Graphic);// Копируем с необходимыми размерами
    jpg->Assign(img->Picture->Bitmap);// Переводим в jpg
    jpg->CompressionQuality = 100;// Задаём качество (от 1 до 100)
    jpg->Compress();              // Сжимаем
    jpg->SaveToFile("image.jpg"); // записываем
    Image1->Width = rim.Right;    // Задаём размер компонента Image
    Image1->Height = rim.Bottom;
    Image1->Canvas->StretchDraw(rim,img->Picture->Bitmap);// Выводим на экран
  delete img;// Уничтожаем объекты
  delete jpg;
  delete P;
  }
SetCurrentDir(a);// Восстановим путь
*********************************** *******************
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Stilet; 11.12.2010 в 10:35.
Smitt&Wesson вне форума Ответить с цитированием
Старый 09.10.2019, 22:56   #2
Валентина174
Новичок
Джуниор
 
Регистрация: 09.10.2019
Сообщений: 2
Злость вот кот на бильдере предпросмотр картинок

Код:
//////////  Форму и на неё Image (Для предпросмотра)
void __fastcall TForm2::CheckBox1Click(TObject *Sender)
{
if (CheckBox1->Checked){
ForPik=new TForm(this);
   ForPik->Height=125;  ForPik->Width=110; // Подбор размера при открытии формы
ForPik->Position=poDesigned; ForPik->BorderStyle=bsToolWindow; ForPik->Color=clBtnFace;
//Formik->TransparentColor=true; Formik->TransparentColorValue=clWhite;
   ForPik->Left = Mouse->CursorPos.x+5;  ForPik->Top = Mouse->CursorPos.y+20;
				  ForPik->Show();
   img  = new TImage(this); //<<--  создаём Image под картинку (смотреть)
	 img->Top=0; img->Left=0;
	  img->Height= ForPik->ClientHeight;img->Width= ForPik->ClientWidth;
   img->Parent=ForPik;
 img->Picture->Assign(Form1->Image5->Picture);// <--- Logo для красоты
   img->Stretch=true;//--------------для Image которого нету нихуя
img->OnMouseDown=EvMousDown;//<====== Два мышиных события ????
}
else {delete ForPik; ForPik=NULL;}
}

/*--------------------------------------------------------
	читает размер картинки, пропорционально изменяет, что бы
  ==============dolbajob ты дед мороз== вышина была 100, делают Image созданному динамически
   Height; Width; Stretch = true; Размеры формы по Image;
			  и копирует картинку в Image; */
template <typename Type> // объявление параметра шаблона функции
	   void En_ter(Type pict_){
	  float  PicProp_W(0.), PicProp_H(0.);
	 PicProp_W = pict_->Width;	PicProp_H = pict_->Height;
Form2->Label1->Caption = String (pict_->Width)+" x "+String(pict_->Height);
  float kf= PicProp_H / PicProp_W;
   PicProp_H = 100; PicProp_W = PicProp_H/kf;
 img->Height=floor(PicProp_H); img->Width=floor(PicProp_W);
		   //----------
	ForPik->ClientHeight = img->Height; ForPik->ClientWidth = img->Width;
  img->Picture->Assign(NULL);
		img->Picture->Assign(pict_);
   //SetWindowPos(ForPik->Handle, HWND_TOPMOST, 0, 0, 0, 0,
   //	SWP_NOMOVE | SWP_NOSIZE);
	 Form2->SetFocus(); }
 //---------------------------------------------------------------------------

void __fastcall TForm2::ListView1MouseMove(TObject *Sender, TShiftState Shift, int X,
          int Y)
{    // =================  Когда ведёшь курсор видно картиночки ==============
 TListItem *pListItem = ListView1->GetItemAt(X, Y);
if(pListItem){
		 static String name_old(""); String name(pListItem->Caption);
if(name == name_old || name.SubString(1,1)== "\" || !Form2->CheckBox1->Checked)return;
	  name_old = name; String start("");
			//------------------------
	 int line = pListItem->Index;
	while(ListView1->Items->Item[line]->Caption.SubString(1,1)!= "\" && line > 0 )
		 { line--;} // поиск папки выше  ( вылет по слешу или нулю )
		   //--------------------------
if (ListView1->Items->Item[line]->Caption.SubString(1,1)== "\") //(по слешу) папка найдена
   start = z_catalog+ ListView1->Items->Item[line]->Caption+"\"+name;//строка нуль
		else start = z_catalog+"\"+name;// не нашёл слеша (вложенную папку) ВООБЩЕЕЕ
	if(!FileExists(start))return;
	  //==============
	if( ExtractFileExt(start).LowerCase()==".jpg"  ||
 ExtractFileExt(start).LowerCase()==".jpeg"){
  TJPEGImage *jp = new TJPEGImage();
jp->LoadFromFile(start);
			En_ter(jp);
	 delete jp; jp = NULL;
		  }	else {     /*Эти блоки вызывают шаблонную функцию (выше она) */
 if(ExtractFileExt(start).LowerCase()==".bmp"){
Graphics::TBitmap *bmp=new Graphics::TBitmap;
bmp->LoadFromFile(start);
		  En_ter(bmp);
	  delete bmp; bmp = NULL;
		  }	else {
	  //==============
  if (ExtractFileExt(start).LowerCase()==".gif"){
 TGIFImage *Gif=new TGIFImage;
Gif->LoadFromFile(start);
		 En_ter(Gif);
		   delete Gif; Gif=NULL;
		  }	else {
	  //==============
  if (ExtractFileExt(start).LowerCase()==".png"){
TPngImage *Png=new TPngImage;
Png->LoadFromFile(start);
		 En_ter(Png);
	delete Png; Png=NULL;
		  } else {
		//==============
  if (ExtractFileExt(start).LowerCase()==".ico"){
		   TIcon* ico=new TIcon; // иконка на Stretch не реагирует
 ico->LoadFromFile(start);
Graphics::TBitmap *bmp=new Graphics::TBitmap;
		  bmp->Assign(ico);       //  преобразуем её в .bmp
			 En_ter(bmp);
	delete ico; ico = NULL; delete bmp; bmp = NULL;
			}    }	 }   }   }   }
		 Timer1->Enabled=true;}
//---------------------------------------------------------------------------
______________________
Форматируйте код и используйте тег [CODE] (кнопка [CODE] в форме сообщения) при вставке кода на форум. Подробнее в FAQ

Последний раз редактировалось Вадим Мошев; 09.10.2019 в 23:04.
Валентина174 вне форума Ответить с цитированием
Старый 11.10.2019, 17:01   #3
Валентина174
Новичок
Джуниор
 
Регистрация: 09.10.2019
Сообщений: 2
По умолчанию

Метод Stretch никуда не годиться.
Есть такая WinApi.
вот она красиво рисует, (правда на канве формы)
====================
Код:
BOOL StretchBlt(
  HDC hdcDest,         // дескриптор приемного DC
  int nXOriginDest,    // x-коорд. верхнего левого угла приёмника
  int nYOriginDest,    // y-коорд. верхнего левого угла приёмника
  int nWidthDest,      // ширина приёмного прямоугольника
  int nHeightDest,     // высота приёмного прямоугольника.
  HDC hdcSrc,          // дескриптор исходного DC
  int nXOriginSrc,     // x-коорд.верхнего левого угла источника
  int nYOriginSrc,     // y-коорд.верхнего левого угла источника
  int nWidthSrc,       // ширина исходного прямоугольника
  int nHeightSrc,      // высота исходного прямоугольника
  DWORD dwRop          // код растровой операции
);
//===================
 /*--------------------------------------------------------
	читает размер картинки, пропорционально изменяет, что бы
  ============== вышина была 100, делают Image созданному динамически
   Height; Width; Stretch = true; Размеры формы по Image;
			  и копирует картинку в Image; */
template <typename Type> // объявление параметра шаблона функции
	   void En_ter(Type pic_t){
	  double PicProp_W(0.), PicProp_H(0.);
	 PicProp_W = pic_t->Width;	PicProp_H = pic_t->Height;
Form2->Label1->Caption = String (pic_t->Width)+" x "+String(pic_t->Height);
  double kf= PicProp_H / PicProp_W;
   PicProp_H = 100; PicProp_W = PicProp_H/kf;
   if((PicProp_W / PicProp_H)> 8.0){PicProp_W /=2; PicProp_H/=2;}
 ForPik->ClientHeight=floor(PicProp_H); ForPik->ClientWidth=floor(PicProp_W);
		   //----------
   Graphics::TBitmap *tBmp = new Graphics::TBitmap;
	tBmp->Assign(pic_t);
  //--------------------
 SetStretchBltMode(ForPik->Canvas->Handle, HALFTONE );
	StretchBlt( ForPik->Canvas->Handle,
	  0, 0,
	  ForPik->ClientWidth, ForPik->ClientHeight,
	  tBmp->Canvas->Handle,
	  0, 0,
	  tBmp->Width, tBmp->Height,
	  SRCCOPY);
	   //--------------------
	 delete tBmp;
	Form2->SetFocus(); }
 //--------------------------------
Валентина174 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Borland C++ Builder Jasper92 Помощь студентам 3 09.12.2010 13:19
Borland C++ Builder m@rusl@12 C++ Builder 1 25.04.2010 15:47
c++ Borland builder 4ika C++ Builder 1 27.11.2009 20:32
Как считать jpg картинку на Borland C++ 3.1 B@R@B@$HK@ Общие вопросы C/C++ 3 28.05.2009 20:59
проблема внедрения в базу paradox файлов word и jpg ghost_7_7_7 БД в Delphi 1 30.01.2008 16:44