Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
162 / 162 / 68
Регистрация: 23.02.2011
Сообщений: 392
1

Увеличительное стекло

08.04.2012, 22:03. Показов 2190. Ответов 7
Метки нет (Все метки)

Требуется сделать подобие увеличительного стекла. Загружаю на форму бмп картинку
C++
1
2
3
4
5
6
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Graphics::TBitmap * pctr = new Graphics::TBitmap;
        pctr->LoadFromFile(OpenPictureDialog1->FileName);
        Form1->Canvas->Draw(20, 20, pctr);
}
, и при передвижении курсора по этой картинке в TPanel надо рисовать кусок этой картинки, причём сам зум регулируется скроллбаром (1-10х), основной вопрос - какими средствами можно вырезать определённую область картинки и регулировать размеры этой области?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.04.2012, 22:03
Ответы с готовыми решениями:

Наложить стекло на форму.
Как можно наложить стекло на форму и вывести какой-нибудь логотип?

Увеличительное стекло
Здравствуйте Мелькнула интересная задачка, заслуживает отдельной темы - есть окно в котором я...

Создать программу увеличительное стекло
Нужно чтоб был круг(стекло) управлять на WASD и чтоб в его диапазоне фигура увеличивалась

30кГц на стекло
Доброго времени суток! думаю автомобилисты многие точно читали что хотят переложить военную...

7
4033 / 2323 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
08.04.2012, 22:26 2
Все это способна сделать(ну, почти) одна-единственная функция StretchDraw( TRect &, Graphics::TGaphic * ).
1
Практикантроп
4695 / 2609 / 503
Регистрация: 23.09.2011
Сообщений: 5,621
08.04.2012, 22:41 3
это пример использования функции, в которой увеличение задается__
C++
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  ZoomIt(Image1->Picture,Image2->Picture,X,Y,8);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ZoomIt(TObject *Source,TObject *Target,
                        int X,int Y,int Zoom )
{
  int Sw,Sh,Tw,Th,Dw,Dh;
  int SX1,SX2,SY1,SY2;
  int TX1,TX2,TY1,TY2;
 
  TPicture *so = (TPicture *)Source;
  TPicture *ta = (TPicture *)Target;
 
  Sw = so->Bitmap->Width;
  Sh = so->Bitmap->Height;
  Tw = ta->Bitmap->Width;
  Th = ta->Bitmap->Height;
  Dw = Tw/2;
  Dh = Th/2;
 
  TX1 = 0;
  TX2 = Tw;
  TY1 = 0;
  TY2 = Th;
 
  SX1 = X-Dw/Zoom;
  SX2 = X+Dw/Zoom;
  SY1 = Y-Dh/Zoom;
  SY2 = Y+Dh/Zoom;
 
  if (SX1<0) {
    TX1 = TX1-(SX1*Zoom);
    SX1 = 00;
  }
  if (SX2>Sw) {
    TX2 = TX2+(Sw-SX2)*Zoom;  SX2 = Sw;
  }
  if (SY1<0) {
    TY1 = TY1-(SY1*Zoom);
    SY1 = 00;
  }
  if (SY2>Sh) {
    TY2 = TY2+(Sh-SY2)*Zoom;
    SY2 = Sh;
  }
 
  ta->Bitmap->Canvas->Brush->Color = clBlack;
  ta->Bitmap->Canvas->FillRect(Rect(0,0,Tw,Th));
  ta->Bitmap->Canvas->CopyRect(Rect(TX1,TY1,TX2,TY2),
                               so->Bitmap->Canvas,
                               Rect(SX1,SY1,SX2,SY2));
}
1
Практикантроп
4695 / 2609 / 503
Регистрация: 23.09.2011
Сообщений: 5,621
08.04.2012, 23:23 4
Зону "лупы" (Image2) надо предварительно инициализировать__
C++
1
2
3
4
5
6
7
8
9
10
      TRect RE;
 
      RE.left = 0; RE.top = 0;
      RE.right = Image2->Width ;
      RE.bottom = Image2->Height ;
      Image2->Picture->Bitmap->PixelFormat = pf24bit;
      Image2->Picture->Bitmap->Width       = Image2->Width ;
      Image2->Picture->Bitmap->Height      = Image2->Height ;
      Image2->Picture->Bitmap->Canvas->Brush->Color = clBlack;
      Image2->Picture->Bitmap->Canvas->FillRect(RE);
Миниатюры
Увеличительное стекло  
1
162 / 162 / 68
Регистрация: 23.02.2011
Сообщений: 392
08.04.2012, 23:39  [ТС] 5
nick42, не могли бы вы, пожалуйста, прикрепить сюда сей проект (у вас, видимо, билдер не 6?).
И каким образом можно сделать это всё без использования компонентов TImage, а используя Canvas?
0
Практикантроп
4695 / 2609 / 503
Регистрация: 23.09.2011
Сообщений: 5,621
08.04.2012, 23:54 6
Лучший ответ Сообщение было отмечено как решение

Решение

Please
Вложения
Тип файла: rar Zoom1-10.rar (588.4 Кб, 95 просмотров)
6
1 / 1 / 0
Регистрация: 06.11.2012
Сообщений: 14
07.11.2012, 21:05 7
nick42, а как это зделать? Разработать графический редактор для работы с изображениями. Обеспечить возможность масштабирования входного изображения и выделения части изображения
0
Модератор
3332 / 2113 / 343
Регистрация: 13.01.2012
Сообщений: 8,244
08.11.2012, 13:34 8
недавно нужно было масштабировать без артефактов, может кому понадобится. делал при помощи свободной библиотеки FreeImage.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    HDC hdc = GetDC(bmp->Handle);
    HBITMAP hbmp = bmp->Handle;
    FIBITMAP *dib = 0;
    BITMAP bm;
    GetObject(hbmp, sizeof(BITMAP), (LPSTR)&bm);
    dib = FreeImage_Allocate(bm.bmWidth, bm.bmHeight, bm.bmBitsPixel);
    int nColors = FreeImage_GetColorsUsed(dib);
    int Success = GetDIBits(hdc, hbmp, 0, FreeImage_GetHeight(dib),
    FreeImage_GetBits(dib), FreeImage_GetInfo(dib), DIB_RGB_COLORS);
    FreeImage_GetInfoHeader(dib)->biClrUsed = nColors;
    FreeImage_GetInfoHeader(dib)->biClrImportant = nColors;
 
    FIBITMAP *_dib = FreeImage_Rescale(dib, w, h, FILTER_BICUBIC);
 
    FreeImage_Unload(dib);
 
    bmp->Handle = CreateDIBitmap(hdc, FreeImage_GetInfoHeader(_dib),
    CBM_INIT, FreeImage_GetBits(_dib), FreeImage_GetInfo(_dib), DIB_RGB_COLORS);
 
    FreeImage_Unload(_dib);
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.11.2012, 13:34

Защитное стекло
здравствуйте! какое стекло заказать для Xiaomi Redmi Note 4 Global на AliExpress.com , чтоб...

Треснуло стекло
В результате падения растрескалось стекло на планшете Multipad 10.1 Ultimate 3G. Когда отключил...

Треснутое стекло iphone 5
Добрый день) Такой странный вопрос. Есть iphone 5 с трещиной по экрану. Вот ей богу я без...

Стекло на Sony Xperia V
Проблема в том, что у меня на телефоне стояла заводская пленка. Но спустя 2 года я хотел поменять...

Стекло и touch-скрин
Здравствуйте, господа. Упал телефон, треснуло стекло и тут же отказался работать абсолютно весь...

Можно ли резать стекло гравером?
Тут надо мне порезать стекло. Есть гравер с отрезными дисками. Кто делал так?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.