C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Работаем с форматом Jpeg  (Прочитано 36869 раз)
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« : 10 Апрель 2008, 21:07:29 »

Здравствуйте всем!

У меня такая проблема.
Создал приложение в котором возможно просматривать картинки jpg. Все то ничего, но КАК сделать так, чтобы не изменяя размера Image сделать zoom+ и zoom-. Желательно и скорость обработки соответствующую. Непонимающий
Пробовал использовать компоненты Rxlib и стандартные Builder 6, но ничего подходящего не нашел. В фотошопе же как то работает, причем скорость отменная.
Кто-нибудь сталкавался с такой проблемой?  Плачущий
Записан
Zor
Глобальный модератор
***

Сказали спасибо: +158/-30
Offline Offline

Сообщений: 2946


« Ответ #1 : 11 Апрель 2008, 00:33:10 »

фотошоп явно не на билдере писался Улыбка
работайте в картинкой в памяти, изменяйте размер, обрезайте - а результат переливайте в имидж.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #2 : 11 Апрель 2008, 10:27:53 »

Я встречал в литературе что можно вставлять Image в ScrollBox  и хотя бы перемещать картинку ползунками, только не возму в толк, как это сделать. Картику вставляю (LoadFromFile), если устанавливаю Stretch то картинка занимает всю Image, если убрать его то показывается в Image лишь часть картинки и скроллинг при этом не появляется, хотя, как я понимаю он должен появляться. Играл я с параметрами Image и ScrollBox, но все безрезультатно. Видимо что-то не так. На уровне фотошопа мне не нужно увеличивать, хотя бы увеличить так, чтобы разглядеть мелкие детали. Наверняка существуют библиотеки сторонних производителей- может кто встречал?
  Непонимающий
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #3 : 11 Апрель 2008, 11:29:50 »

Я использовал PaintBox, ScrollBar и рисовал с помощью GDI+. Т.е. в памяти хранится картинка, текущий масштаб и рисую на паитбоксе нужный кусечек картинки с помощью функции DrawImage. наверное сделано через ж, но работает причем достаточно быстро.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #4 : 11 Апрель 2008, 18:03:40 »

to bred

а можно исходник с примером? (где это реализоватся)
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #5 : 14 Апрель 2008, 09:16:15 »

Исходник нормального проекта не дам - слишком много чистить. могу дать проект в котором я разбирался с ГДИ+ и учился с ней работать, но боюсь там мало чего полезного будет.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #6 : 14 Апрель 2008, 15:01:34 »

to bred

согласен и с этим, выбора все равно нет. а еще ВОПРОС, как после вывода на канву картинки, при необходимости очистить ее? пробовал методы Free и FreeInstance, они ошибку выдают.
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #7 : 14 Апрель 2008, 15:08:02 »

Для очистки можно ее просто закрасить прямоугольником цвета фона. можно отключить свое рисование и заставить перерисоваться - по идее должен стереть картинку.

ЗЫ. приложил проект, но там такая муть... аж самому страшно.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #8 : 14 Апрель 2008, 15:13:31 »

А какой цвет выбирать для фона? Я как то программу писал и что-то закрашивал, вроде бы цветом фона, ну дак вот, на моем компе было все ОК, а на другом этот цвет не совпадал с цветом остальных элелементов формы.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #9 : 14 Апрель 2008, 15:16:23 »

to Bred

Спасибо за ссылку. Вижу что муть, но разобраться можно,если знать что собственно эта програмка делает на выходе?
Скомпилироват не могу, просит файл GDIPlus.h , а где его взять. И еще ей ресурс нужен, которого тоже нет,в итоге матерится мой Builder 6.
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #10 : 14 Апрель 2008, 15:27:21 »

ну если мне память не изменяет, то там смотрелось как рисовать любую картинку, как ее вписать в зону видимости, как ее можно прокручивать, и как можно на ней что-нить простенькое (прямоугольничег) нарисовать.
По поводу того каким цветом закрашивать, надо каким-то образом из системы брать значение цвета окна и им пользоваться, что-нить типа clBtnFace, clWindow. или вообще брать у тойже формы значение поля color и им красить %)

ЗЫ. Хм.. вложил либу и ашники они там друг за дружку цепляются лень откидывать не нужные:). но я их ковырял для 5 буилдера причем из майкросовстовских. если воспользоваться поиском по форуму, то найдешь темы где я на них ругался;) Кстати, если мне память не изменяет там народ говорил что в 6 и выше ГДИ+ нормально подключается сама по себе.
« Последнее редактирование: 14 Апрель 2008, 15:32:51 от bred » Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #11 : 14 Апрель 2008, 15:43:59 »

to Bred

Спасибо, с этим разобрался. Теперь матерится на отсутствие функций min и max  в файле GdiplusTypes.h. Остальное вроде все ОК.

Я еще нашел алгоритмик, билинейной интерполяции, он то и увеличивает картинку -не работал с таким?
Записан
bred
А моск есть?
Участник
**

Сказали спасибо: +6/-0
Offline Offline

Сообщений: 387

Нет - это фантастика!


« Ответ #12 : 14 Апрель 2008, 15:48:59 »

ну, блин, напиши ему сам что такое мин и что такое макс;) я реально около месяца ковырял эти библиотеки пытаясь прикрутить к проекту так как мне это надо было. (так долго потому как паралеллно еще другим занимался) а вообще вот тут говорят что в 6-м буилдере есть библиотеки для работы с гди+

нет, не встречал. ради интереса посмотрел бы с удовольствием.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #13 : 14 Апрель 2008, 16:04:03 »

to Bred

Этот алгоритимик описан в книге "C++ Builder 5 Руководство разработчика. Том 2 Сложные вопросы программирования". Один из авторов Д.Холингвэрт. Только к этой книге есть диск, а у меня его нет, там этот пример в исходнике.

Я рабобрался Веселый , очищать картинку можно вот так например: Image2->Picture->Bitmap->FreeImage();

Исходную картинку, если размер большой (у меня 2448х3264), уместить на канву, с прокруткой можно следующим образом: разместить ScrollBox, выствить на нем AutoScroll и AutoSize в false, потом на ScrollBox положить Image, причем Align= alClient, AutoSize в false, Stretch=false. А перед загрузкой картинки на Image выставить ScrollBox1->VertScrollBar->Range=высота картинки, ScrollBox1->HorzScrollBar->Range=ширина картинки. И тогда возможно с помощью ползунков прокручивать оную.

Осталось научиться прокручивать картинку с помощью мыши, и увеличить исходный размер картинки (буду пробовать билинейную интерполяцию).

Если кто уже работал с этим, подскажите. Буду рад любой помощи.

------------------
Глаза боятся-руки делают!
« Последнее редактирование: 14 Апрель 2008, 16:24:16 от Nikita » Записан
VerZer
Участник
**

Сказали спасибо: +92/-10
Offline Offline

Сообщений: 1138


« Ответ #14 : 14 Апрель 2008, 20:28:36 »

вот так когда-то делал:
Код:
void __fastcall TForm1::ScrollBox1MouseWheel(TObject *Sender, TShiftState Shift,
      int WheelDelta, TPoint &MousePos, bool &Handled)
{
  int incr = 16;//плавность хода

  if (Shift.Contains(ssAlt)) {
    if (ScrollBox1->HorzScrollBar->Position < ScrollBox1->HorzScrollBar->Range-ScrollBox1->ClientWidth && WheelDelta < 0)
      ScrollBox1->HorzScrollBar->Position -= WheelDelta/incr;
    if (ScrollBox1->HorzScrollBar->Position > 0 && WheelDelta > 0)
      ScrollBox1->HorzScrollBar->Position -= WheelDelta/incr;
  } else {
    if (ScrollBox1->VertScrollBar->Position < ScrollBox1->VertScrollBar->Range-ScrollBox1->ClientHeight && WheelDelta < 0)
      ScrollBox1->VertScrollBar->Position -= WheelDelta/incr;
    if (ScrollBox1->VertScrollBar->Position > 0 && WheelDelta > 0)
      ScrollBox1->VertScrollBar->Position -= WheelDelta/incr;
  }
}
сейчас глянул - вроде работает
заочно согласен, что можно как-то проще. покажите как Улыбка
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #15 : 14 Апрель 2008, 21:55:59 »

Спасибо за исходник. Завтра обязательно попробую его.

Еще один вопросик.
Исходные данные:
Допустим у нас имеется 20 (а может быть 50, или больше) jpg картинок, количество картинок заранее не известно, поэтому это число нельзя вбить в проект.
Найти:
Собственно вопрос , как программно разместить на форме 20 (любое количество) объектов Image, и загрузить туда jpg картинки?
Как загрузить jpg картинку в Image собственно уже найдено (Image->Picture->LoadFromFile(путь к файлу)), важнее как  задать и разместить такое количество объектов Image? (массив не работает)
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #16 : 14 Апрель 2008, 23:15:46 »

http://cbuilder.ru/index.php/topic,909.0.html
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #17 : 15 Апрель 2008, 18:06:35 »

Спасибо oxotnik

вот этот код работает  Смеющийся

void __fastcall TForm2::Button2Click(TObject *Sender)
{
   int screenW=GetSystemMetrics(SM_CXSCREEN)-10;
  int screenH=GetSystemMetrics(SM_CYSCREEN);

  int h=screenH/3;
  int w=screenW/8;



  TImage *Pict;
 
  for(int i=0;i<Form1->k;i++)
   {
     Pict = new TImage (this);
     Pict->Parent =ScrollBox1;
     Pict->Name = "Image_" + IntToStr(i);
     Pict->Width = w;
     Pict->Height = h;
     Pict->Height=h;
     Pict->Width=w;
     Pict->Stretch=true;
     Pict->Proportional=true;
     Pict->Top=h;
     Pict->Left=i*w;
     Pict->Picture->LoadFromFile("data"+IntToStr(i+1)+".jpg");

     ImMap[ i ]=Pict;
   }

}

данный код создает "к" объектов Image (загружает в него картинку) и располагает их в одну строку, при нехватке экрана, автоматически добавляется горизонтальная полоса прокрутки.
« Последнее редактирование: 16 Апрель 2008, 11:49:17 от Nikita » Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #18 : 16 Апрель 2008, 12:32:10 »

Возникла одна проблема, с вышеуказанным кодом.

Картинки выводятся на отдельной форме (все отлично), которая открывается при нажатии определенной кнопки на первой форме. После того как код отработал, и я закрываю вторую форму я удаляю созданные объекты (там я по образу и подобию еще метки вывожу, с надписями), вот таким образом:

for (int j = 0; j<Form1->k; j++)
      {delete ImMap[j]; delete ImLab[j];}


А теперь, когда я опять нажимаю на кнопку, чтобы повторить отображение картинок (код вывода картинок на другой форме должен повториться еще раз),  вторая форма открывается, но ничего не отображается.

В чем может быть дело???
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #19 : 16 Апрель 2008, 13:44:02 »

проект выложи, понятней будет
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #20 : 16 Апрель 2008, 16:38:40 »


Выложил исходник файлов. Эта форма открывается как модальная, данные из первой формы только количество файлов (переменная к).
Все действия происходят в FormCreate и FormClose, плюс кнопочка закрытия.

Смысл в том, что при первом открытии этой формы, все картинки и лэйблы нормально отображаются.
Потом закрывается форма, нажатием соответствующей кнопки.
Если же теперь еще раз попытаться открыть ее, то на появившейся форме ничего не отображается, кроме кнопки закрытия. Собственно в этом и проблема.
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #21 : 16 Апрель 2008, 16:56:41 »

Немного модифицировав код:

Код
 for (int j = 0; j<Form1->k; j++)
     {delete ImMap[j]; ImMap.clear(); delete ImLab[j]; ImLab.clear();}

Теперь каждый раз, при открытии формы отображаются картинки, за исключением первой, но место под нее резервируется.
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #22 : 16 Апрель 2008, 17:00:21 »

весь проект
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #23 : 16 Апрель 2008, 17:07:18 »

Весь проект там ни к чему, потому что все действия по выводу происходят только в этом модуле. Эта форма и создана только для того, чтобы можно было посмотреть уменьшенные копии картинок. В принципе в приведенном коде видно, что и куда суется. Единственная посторонняя переменная это к(количество картинок).
Ну и из личных соображений не могу все выложить (не себе пишу).
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #24 : 16 Апрель 2008, 17:23:40 »

у меня все работает
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #25 : 16 Апрель 2008, 17:39:24 »

To Oxotnik Огоромное спасибо!  Смеющийся


В основном приложении у меня был код:
 
 
Код
Form2->ShowModal();

а теперь я добавил как у тебя:

Код
  TForm2 *Form2 = new TForm2(this);
 Form2->ShowModal();
 delete Form2;

и заработало все.

Я так понял что все дело было в вызове самой формы, и отображение (ImMap) не удалялось.  Я правильно понял? До этого случая я все время вызывал модальные формы через ShowModal() без добавления обрамлений с обеих сторон. (может это и не правильно было). Ты можешь объяснить по научному что я не так сделал, чтоб впредь не втыкаться по пустякам.
 
Записан
oxotnik
Глобальный модератор
***

Сказали спасибо: +100/-15
Offline Offline

Сообщений: 2425


« Ответ #26 : 16 Апрель 2008, 17:45:47 »

у меня и так и сяк работает
создание объектов поставь не на OnCreate формы а на OnShow
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #27 : 16 Апрель 2008, 21:32:35 »

To VerZer

Я хочу сказать про выложенный тобой код.
Дело в том что Image находится сверху ScrollBox, то есть ScrollBox родитель Image. И когда я вставляю код на обработку события ScrollBox1MouseWheel, то все успешно компилируется, только вот незадача, при попытке подвигать картинку ничего не происходит.
Я так понимаю это потому, что Image то сверху, и событие до ScrollBox не доходит.

Я прав или нет? и если да, то как исправить это положение дел? если нет, то почему у меня не работает этот код?  Непонимающий
Записан
VerZer
Участник
**

Сказали спасибо: +92/-10
Offline Offline

Сообщений: 1138


« Ответ #28 : 16 Апрель 2008, 22:29:22 »

у ScrollBox'а TabStop = true
Записан
Nikita
Участник
**

Сказали спасибо: +6/-1
Offline Offline

Сообщений: 476


« Ответ #29 : 17 Апрель 2008, 12:38:16 »

To VerZer

Пробовал у ScrollBox-а TabStop = true, и наоборот, и еще разные параметры перебирал, не получается почему то. Туда даже событие не доходит.

В чем может быть проблема?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines
Страница сгенерирована за 0.155 секунд. Запросов: 22.