Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329

Вывод картинки в форме

08.09.2014, 13:19. Показов 1483. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нашел такой вот код
uPic.cpp
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
#include <vcl.h>
#pragma hdrstop
 
#include "uPic.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfPic *fPic;
//---------------------------------------------------------------------------
__fastcall TfPic::TfPic(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfPic::FormCreate(TObject *Sender)
{
  C = new TMemoryStream();
  ptBmp = new Graphics::TBitmap;
  ptJpg=new TJPEGImage;
  ptGif=new TGIFImage;
  ptPng=new TPngImage;
//  ptPng->Assign(ptBmp); // это надо чтобы у PNG появился Header
}
//---------------------------------------------------------------------------
void __fastcall TfPic::FormClose(TObject *Sender, TCloseAction &Action)
{
  delete ptJpg;
  delete ptGif;
  delete ptPng;
  delete ptBmp;
  delete C;
}
//---------------------------------------------------------------------------
void __fastcall TfPic::FormShow(TObject *Sender)
{
  C->Seek(0,0);
  if (*(Word*)C->Memory == 0xD8FF) Image1->Picture->Graphic=ptJpg; else
  if (*(LongWord*)C->Memory== 0x474E5089) Image1->Picture->Graphic=ptPng; else
  if (*(LongWord*)C->Memory == 0x38464947) Image1->Picture->Graphic=ptGif; else
  if (*(Word*)C->Memory== 0x4D42) Image1->Picture->Graphic=ptBmp;
  Image1->Picture->Graphic->LoadFromStream(C);
}
На самой форме TImage *Image1;

MemoryStream C инициализируется извне до вызова Show
Код рабочий.
Но в исходном примере строка
C++
1
//  ptPng->Assign(ptBmp); // это надо чтобы у PNG появился Header
была раскоментирована. У меня при выполнении - выдавала ошибку Access Violation: Write of Address 00000000
После моего закоментирования данной строки все работает.
Но. Я прошу вашей помощи разобраться - а зачем там это было?
Может нюансы C++ Builder 2009 - для которого пример?
У меня XE4
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2014, 13:19
Ответы с готовыми решениями:

картинки в форме
мне нужно на фон форме поставить картинку, подскажите пожайлуста как это сделать.

Borland C++ 6. Белый фон картинки в форме
Доброго времени суток, форумчане. Делаю мини-курсовой проект. Наткнулся на загвоздку. При вставке картинок с вырезанным фоном (в формате...

Вывод картинки на экран в Borland C++
#include &lt;vcl.h&gt; #pragma hdrstop #include &quot;Unit1.h&quot; //--------------------------------------------------------------------------- ...

7
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,411
Записей в блоге: 3
08.09.2014, 18:42
Цитата Сообщение от krv Посмотреть сообщение
MemoryStream C инициализируется извне до вызова Show
Ну дык покажи, как это происходит... Иначе что-то неясно... И, кстати, *.h файл приведи, все там инклюды есть?
0
 Аватар для DeadHipo
85 / 85 / 33
Регистрация: 21.09.2013
Сообщений: 339
08.09.2014, 19:59
D1973,
C++
1
#include <Vcl.Imaging.pngimage.hpp>
Без инклюдов и не работало бы

C++
1
2
3
4
5
6
7
8
9
10
11
12
class TForm2 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button1;
    void __fastcall Button1Click(TObject *Sender);
    void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
private:    // User declarations
public:     // User declarations
    TBitmap * ptBmp;
    TPngImage *mypng;
    __fastcall TForm2(TComponent* Owner);
};
C++
1
2
3
4
5
6
void __fastcall TForm2::Button1Click(TObject *Sender)
{
ptBmp = new TBitmap();
mypng = new TPngImage();
mypng->Assign(ptBmp4);
}
Странно что этот код работает раз на 1 - 4 попытки

Добавлено через 13 минут
Но вообще, скорее всего всё дело в методе Assign... это всё таки не просто передача изображения, а создание полной копии объекта с параметрами итд. А у тебя в битмапе пусто.
C++
1
2
3
4
ptBmp = new TBitmap();
ptBmp->LoadFromFile(".................bmp");
mypng = new TPngImage();
mypng->Assign(ptBmp);
Отработало кучу раз и не разу не вылетело.
ps. Это моё мнение. Если не прав, поправьте.
0
Модератор
 Аватар для D1973
9924 / 6460 / 2457
Регистрация: 21.01.2014
Сообщений: 27,411
Записей в блоге: 3
08.09.2014, 20:13
Цитата Сообщение от DeadHipo Посмотреть сообщение
#include <Vcl.Imaging.pngimage.hpp>Без инклюдов и не работало бы
Это-то понятно, у меня, к примеру, не компилировалось, пока не включил такое:
C++
1
2
3
#include <JPEG.hpp>
#include <Vcl.Imaging.GIFImg.hpp>
#include <Vcl.Imaging.pngimage.hpp>
Мне интересно, как
Цитата Сообщение от krv Посмотреть сообщение
MemoryStream C инициализируется извне
Сдается мне, именно оттуда "ноги растут"

Добавлено через 4 минуты
Цитата Сообщение от krv Посмотреть сообщение
Image1->Picture->Graphic->LoadFromStream(C);
А где в сам поток что-то загружается, чтобы оттуда грузить в Image1->Picture->Graphic?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
09.09.2014, 11:52  [ТС]
Я приведу код хедера. Вот:
Кликните здесь для просмотра всего текста
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
#ifndef uPicH
#define uPicH
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <Jpeg.hpp>
#include "GIFimg.hpp"
#include "pngimage.hpp"
//---------------------------------------------------------------------------
class TfPic : public TForm
{
__published:    // IDE-managed Components
  TImage *Image1;
  TPanel *Panel1;
  TLabel *Label1;
  TButton *bOK;
  TButton *bCancel;
  void __fastcall FormCreate(TObject *Sender);
  void __fastcall FormClose(TObject *Sender, TCloseAction &Action);
  void __fastcall FormShow(TObject *Sender);
  void __fastcall bOKClick(TObject *Sender);
private:    // User declarations
public:     // User declarations
  __fastcall TfPic(TComponent* Owner);
  TMemoryStream* C;
  Graphics::TBitmap* ptBmp;
  TJPEGImage *ptJpg;
  TGIFImage *ptGif;
  TPngImage *ptPng;
};
//---------------------------------------------------------------------------
extern PACKAGE TfPic *fPic;
//---------------------------------------------------------------------------
#endif

Вот код заполнения потока картинки:
Кликните здесь для просмотра всего текста
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
//гте то выше
void __fastcall TIDThread::Execute()
{
  m = new TStringStream("",TEncoding::UTF8,true);
  http = new TIdHTTP();
  TIdSSLIOHandlerSocketOpenSSL *ssl= new TIdSSLIOHandlerSocketOpenSSL(NULL);
  http->IOHandler = ssl;
  http->HandleRedirects = true;
  sEncodedURL = TIdURI::URLEncode(sURL);
  http->Get(sEncodedURL,m);
  ViewPic();
}
///
//картинка
void __fastcall TIDThread::ViewPic()
{
  m->Position = 0;
  fPic = new TfPic(Application);
  try {
    fPic->Position = poScreenCenter;
    fPic->C->CopyFrom(m, m->Size);
    fPic->ShowModal();
    if (fPic->ModalResult==mrOk) {
      ...
    } else {
      ...
    }
  } __finally {
    delete fPic;
  }
}


Естественно проверки что это картинка или нет - я не указал, чтобы не загромождать деталями.
Код отображения - рабочий.
Вопрос именно в части конструктора - зачем была рекомендация после создания PNG обьекта привязывать его к BMP
Я думаю, что эта рекомендация была для 2009 Билдера.
Потом эти вещи были доработаны, и так шаманить стало не нужно.
Спрашивал, может кто знает подробности, сталкивался.
Ну да ладно, работает же...

Добавлено через 21 минуту
А, конечно же в этом примере надо
C++
1
    Synchronize(&ViewPic);
Выкусывал код - ошибся.
Ибо подразумевается работа в потоках.
0
 Аватар для DeadHipo
85 / 85 / 33
Регистрация: 21.09.2013
Сообщений: 339
09.09.2014, 14:06
krv, глупый вопрос скорее всего, но у тебя в коде Synchronize стоит?
Или ты сам уже понял в чём беда?
0
74 / 54 / 17
Регистрация: 10.07.2014
Сообщений: 329
09.09.2014, 14:13  [ТС]
В коде - стоит.
Без него вообще бЯда была.
Внешний вид форм ломался, вылетало сразу и т.д.
0
 Аватар для DeadHipo
85 / 85 / 33
Регистрация: 21.09.2013
Сообщений: 339
09.09.2014, 19:23

Не по теме:

krv, странно, что работает у меня почти что аналогичный код не работает :D



Добавлено через 5 минут
Может тебе стоит всё в потоке обработать?
И
C++
1
Image1->Picture->Graphic->LoadFromStream(C);
и проверку на тип...
Просто, как мне кажется, если подумать, то этот код можно упростить и он точно не после танцев будет работать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.09.2014, 19:23
Помогаю со студенческими работами здесь

Вывод картинки на рабочий стол...
У меня возник такой вопрос: &quot;Можно-ли вывести на рабочий стол картинку без окна формы? И можно-ли сделать её за значками рабочего...

Создание dll с изображениями .PNG и вывод их в Image на форме
Всем привет. Эта тема как я уже заметил не первая. Бывал тут. Вроде всё понятно да во только у меня как и у petruchodd аналогичная...

Вывод чисел не в экспоненциальной форме записи функцией FormatFloat
FormatFloat() E+, E-, e+, e- Что это означает -8,99e-3 как понять такую запись (как его перевести в обычную форму где есть только 1,2...

Картинки в форме
Подскажите, есть необходимость вывести в форму типа «несколько элементов» маленькие превью картинок (картинки хранятся вне базы, в базе...

Мерцают картинки в форме!
Доброго времени суток! Вводная: В форму добавил несколько картинок (.bmp), перекрыл одни картинки другими (разные цвета). Цель -...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru