вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 04.05.10 20:43
Оценка:
Имеется форма на Visual C++ 6.0
В диалоге присутствует элемент picture control. Каким образом можно вывести картинки в picture control, которые хранятся на фтп-сервере в формате jpg и png?
CBitmap работает только с bmp файлами. А как тогда быть с jpg и png? И есть ли в mfc функции по работе с ftp?
Re: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 04.05.10 21:10
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:

_>jpg и png?

GDI+ умеет работать с ними. Либо смотрите в сторону libjpeg и libpng
Re[2]: вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 05.05.10 20:24
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

G_>Здравствуйте, evgeniy_ptz, Вы писали:


_>>jpg и png?

G_>GDI+ умеет работать с ними. Либо смотрите в сторону libjpeg и libpng

можно пример по работе с gdi+ библиотекой, например, загрузить картинку в формате jpg из папки и вставить в picture control
Re[3]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 06.05.10 10:58
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:
_>можно пример по работе с gdi+ библиотекой, например
Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован
Re[4]: вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 10.05.10 22:16
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

G_>Здравствуйте, evgeniy_ptz, Вы писали:

_>>можно пример по работе с gdi+ библиотекой, например
G_>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован

А если использовать класс Cimage должно получиться?
Он кстати есть в студии 2005?
Re[5]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 11.05.10 04:52
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:

_>Здравствуйте, Guard_h4s, Вы писали:


G_>>Здравствуйте, evgeniy_ptz, Вы писали:

_>>>можно пример по работе с gdi+ библиотекой, например
G_>>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован

_>А если использовать класс Cimage должно получиться?

Он не умеет загружать jpeg и т.п. Сначала все равно придется распаковывать.
_>Он кстати есть в студии 2005?
CImage класс библиотеки ATL. Так что зависит от комплектации студии(она тоже разная бывает)
Re[6]: вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 13.05.10 21:45
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

G_>Здравствуйте, evgeniy_ptz, Вы писали:


_>>Здравствуйте, Guard_h4s, Вы писали:


G_>>>Здравствуйте, evgeniy_ptz, Вы писали:

_>>>>можно пример по работе с gdi+ библиотекой, например
G_>>>Под рукой нет ничего — в MSDNе есть примеры, точно. GDI+ неплохо документирован

_>>А если использовать класс Cimage должно получиться?

G_>Он не умеет загружать jpeg и т.п. Сначала все равно придется распаковывать.
_>>Он кстати есть в студии 2005?
G_>CImage класс библиотеки ATL. Так что зависит от комплектации студии(она тоже разная бывает)

Он умеет работать сохранять в jpeg, gif, png и др. а загружать ещё больше может.
Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге.
CStatic m_photo;
CImage image;
image.Load("670.jpg");
 
HBITMAP hbmp=m_photo.GetBitmap();
CBitmap* bmp=CBitmap::FromHandle(hbmp);
CDC dc;
dc.CreateCompatibleDC(NULL);
CBitmap* old=dc.SelectObject(bmp);
m_photo.SetBitmap(image);
 
int x=0;
int y=0;
 
image.AlphaBlend(dc,x,y,0xff,AC_SRC_OVER);
 
dc.SelectObject(old);
 
m_photo.Invalidate();


только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(
Re[7]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 14.05.10 07:45
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:

_>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(

HBITMAP hbmp=m_photo.GetBitmap(); Это что?
Re[8]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 14.05.10 08:08
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

G_>Здравствуйте, evgeniy_ptz, Вы писали:


_>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(

G_>HBITMAP hbmp=m_photo.GetBitmap(); Это что?

Вобщем, вот так работает(WTL):
CImage image;
image.Load(_T("test.png"));
m_photo.SetBitmap(image);

Что то вы намудрили с альфаблендом.
Re[9]: вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 14.05.10 21:19
Оценка:
Здравствуйте, Guard_h4s, Вы писали:

G_>Здравствуйте, Guard_h4s, Вы писали:


G_>>Здравствуйте, evgeniy_ptz, Вы писали:


_>>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(

G_>>HBITMAP hbmp=m_photo.GetBitmap(); Это что?

G_>Вобщем, вот так работает(WTL):

G_>
G_>CImage image;
G_>image.Load(_T("test.png"));
G_>m_photo.SetBitmap(image);
G_>

G_>Что то вы намудрили с альфаблендом.

так тоже не выводит, только рамку картинки, а саму картинку нет(
альфабленд для png использую.
Re[7]: вывод картинки с ftp-сервера
От: Кодт Россия  
Дата: 19.05.10 22:08
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:

_>Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге.

_>
_>CStatic m_photo;
_>CImage image;
_>image.Load("670.jpg");
 
_>HBITMAP hbmp=m_photo.GetBitmap();
_>CBitmap* bmp=CBitmap::FromHandle(hbmp);
_>CDC dc;
_>dc.CreateCompatibleDC(NULL);
_>CBitmap* old=dc.SelectObject(bmp);
_>m_photo.SetBitmap(image);
 
_>int x=0;
_>int y=0;
 
_>image.AlphaBlend(dc,x,y,0xff,AC_SRC_OVER);
 
_>dc.SelectObject(old);
 
_>m_photo.Invalidate();


_>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(


Если это сплошной отрывок кода, то это бред!
А если это несколко фрагментов, то неплохо бы показать, какой фрагмент в какой функции.
Зачем загруженная картинка блендится со старой картинкой из контрола?
Куда девается старая картинка? (Из контрола мы её вытащили и засунули в контекст; а затем вытащили из контекста и... и всё).
Куда девается новая картинка? Хэндл на неё засунули в контрол. А потом вышли из функции и грохнули СImage, и что случилось с хэндлом?

По уму, надо завести CImage m_image на всё время жизни окна. В OnCreate/OnInitDialog загрузить туда картинку, затем передать хэндл в контрол, и всё.
Перекуём баги на фичи!
Re[8]: вывод картинки с ftp-сервера
От: evgeniy_ptz Россия  
Дата: 29.05.10 13:37
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, evgeniy_ptz, Вы писали:


_>>Написал код по работе с CImage, он загружает картинку и прорисовывает в элементе picture control на диалоге.

_>>
_>>CStatic m_photo;
_>>CImage image;
_>>image.Load("670.jpg");
 
_>>HBITMAP hbmp=m_photo.GetBitmap();
_>>CBitmap* bmp=CBitmap::FromHandle(hbmp);
_>>CDC dc;
_>>dc.CreateCompatibleDC(NULL);
_>>CBitmap* old=dc.SelectObject(bmp);
_>>m_photo.SetBitmap(image);
 
_>>int x=0;
_>>int y=0;
 
_>>image.AlphaBlend(dc,x,y,0xff,AC_SRC_OVER);
 
_>>dc.SelectObject(old);
 
_>>m_photo.Invalidate();


_>>только вот картинку он в объект image загружает, а почему то саму картинку не прорисовывает, только чертит рамку по размеру фото. Что тут не так?(


К>Если это сплошной отрывок кода, то это бред!

К>А если это несколко фрагментов, то неплохо бы показать, какой фрагмент в какой функции.
К>Зачем загруженная картинка блендится со старой картинкой из контрола?
К>Куда девается старая картинка? (Из контрола мы её вытащили и засунули в контекст; а затем вытащили из контекста и... и всё).
К>Куда девается новая картинка? Хэндл на неё засунули в контрол. А потом вышли из функции и грохнули СImage, и что случилось с хэндлом?

К>По уму, надо завести CImage m_image на всё время жизни окна. В OnCreate/OnInitDialog загрузить туда картинку, затем передать хэндл в контрол, и всё.



void CReaderDlg::OnTimer(UINT nIDEvent) 
{
    CDialog::OnTimer(nIDEvent);

    m_reader = new CReader;
    if(!(m_reader->Reader_Init()))
        EndDialog(0);
    
        if(!(m_reader->Read_serial_number()))
            EndDialog(0);

            
        if(m_reader->Card_read())
        {
            
                //if (m_foto.IsEmpty())
                //return false;
                    
            m_birthday_CTRL.SetWindowText(m_reader->birth);    
            m_surname_CTRL.SetWindowText(m_reader->Familiya);
            m_name_CTRL.SetWindowText(m_reader->Imya);
            m_patronymic_CTRL.SetWindowText(m_reader->Ot4estvo);
            m_kurs_CTRL.SetWindowText(m_reader->Kurs);
            m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);
            UpdateData(FALSE);

            m_foto = m_reader->Foto;

            image.Load(LPCTSTR(m_foto));

            int w = image.GetWidth(); 
            int h = image.GetHeight();     
            int tnh = 200;
            int tnw = 200 * w / h;
            int bpp = image.GetBPP();
    
            image2.Create(tnw,tnh,bpp);
            HDC h2=image2.GetDC();

            SetStretchBltMode(h2,HALFTONE);
            image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);
            image2.ReleaseDC();

            HBITMAP        hbmp = m_photo.GetBitmap();
            CBitmap       *bmp = CBitmap::FromHandle(hbmp);
            CDC            dc;
            dc.CreateCompatibleDC(NULL);
            CBitmap*    old = dc.SelectObject(bmp);
            m_photo.SetBitmap(image2);

            
            dc.SelectObject(old);
            m_photo.Invalidate();
            
        }
        else
        EndDialog(0);
}


значит выводит картинку, но падает с ошибкой
Debug Assertion Failed!

Program:...
File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h
Line:503

Expression: m_hBitmap==0

что нужно конкретно в коде подредактировать, можете написать, а не догадки строить.
Спасибо.
Re[9]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 30.05.10 08:37
Оценка:
ассерт и вылетает именно потому что вы используете BITMAP до инициализации.
Там действительно написан бред. Код что я приводил выше работает(я проверял)
Re[10]: вывод картинки с ftp-сервера
От: Guard_h4s Россия  
Дата: 30.05.10 10:17
Оценка:
_>так тоже не выводит, только рамку картинки, а саму картинку нет(
скорее всего вы стиль контролу выставили неправильный
Re[9]: вывод картинки с ftp-сервера
От: Кодт Россия  
Дата: 31.05.10 08:23
Оценка:
Здравствуйте, evgeniy_ptz, Вы писали:

_>void CReaderDlg::OnTimer(UINT nIDEvent)

Нужны ОЧЕНЬ ВЕСКИЕ ОСНОВАНИЯ, чтобы засовывать логику инициализации (а, тем более, захлопывания) диалога в OnTimer.
Если этими основаниями было "глючит в OnInitDialog", — значит, есть ошибки именно на стадии создания диалога.

_>{
_>    CDialog::OnTimer(nIDEvent);

_>    m_reader = new CReader; // вот здесь, похоже, мы устраиваем утечки памяти - создавая новый m_reader на каждый такт
_>    if(!(m_reader->Reader_Init()))
_>        EndDialog(0);
    
_>        if(!(m_reader->Read_serial_number()))
_>            EndDialog(0);

            
_>        if(m_reader->Card_read())
_>        {
            
_>                //if (m_foto.IsEmpty())
_>                //return false;
                    
_>            m_birthday_CTRL.SetWindowText(m_reader->birth);    
_>            m_surname_CTRL.SetWindowText(m_reader->Familiya);
_>            m_name_CTRL.SetWindowText(m_reader->Imya);
_>            m_patronymic_CTRL.SetWindowText(m_reader->Ot4estvo);
_>            m_kurs_CTRL.SetWindowText(m_reader->Kurs);
_>            m_fakultet_CTRL.SetWindowText(m_reader->Fakultet);
_>            UpdateData(FALSE);

_>            m_foto = m_reader->Foto;

_>            image.Load(LPCTSTR(m_foto)); // где объявлена эта переменная? цикл жизни её и его содержимого?

_>            int w = image.GetWidth(); 
_>            int h = image.GetHeight();     
_>            int tnh = 200;
_>            int tnw = 200 * w / h;
_>            int bpp = image.GetBPP();
    
_>            image2.Create(tnw,tnh,bpp); // где объявлена эта переменная? цикл жизни её и его содержимого?
_>            HDC h2=image2.GetDC();

_>            SetStretchBltMode(h2,HALFTONE);
_>            image.StretchBlt(h2,0,0,tnw,tnh,SRCCOPY);
_>            image2.ReleaseDC();

_>            HBITMAP        hbmp = m_photo.GetBitmap(); // hbmp утекает: мы её взяли из контрола и забыли
_>            CBitmap       *bmp = CBitmap::FromHandle(hbmp);
_>            CDC            dc;
_>            dc.CreateCompatibleDC(NULL);
_>            CBitmap*    old = dc.SelectObject(bmp);
_>            m_photo.SetBitmap(image2); // ... подменив свеженарисованной картинкой (которую вскоре уничтожим)

_>            dc.SelectObject(old);
_>            m_photo.Invalidate();
            
_>        }
_>        else
_>        EndDialog(0);
_>}


_>значит выводит картинку, но падает с ошибкой

_>Debug Assertion Failed!

_>Program:...

_>File: c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h
_>Line:503

_>Expression: m_hBitmap==0


Для чего у нас есть отладчик, э? Посмотреть стек — откуда была вызвана эта "строка 503", что за объект, и какого чёрта там отсутствует m_hBitmap?
У тебя, например, нет проверок — загрузилась картинка в image, не загрузилась...

_>что нужно конкретно в коде подредактировать, можете написать, а не догадки строить.

Боюсь, моё мнение совпадает с мнением капитана Смоллетта. Мне здесь всё не нравится.
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.