Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 83
1

Конвертация из bmp в png

06.02.2019, 23:38. Показов 2231. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.

Возник вопрос по поводу использования библиотек gdiplus.h. В MSDN есть готовый код который позволяет сохранить изображение из формата bmp в формат png. Я переписал этот код и подставил названия своих картинок, вместо тех которые там были использованы по умолчанию. Код идеально компилировался, ошибок не дает, отрабатывает без проблем, но изображение с расширением .png не появляется в папке с проектом (путь указан точно, так как он используется другими функциями и точно рабочий). Кто работал с классом Image, подскажите где искать решение?

Ниже пример кода:
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
// Initialize GDI+.
        GdiplusStartupInput gdiplusStartupInput;
        ULONG_PTR gdiplusToken;
        GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
        CLSID   encoderClsid;
        Status  stat;
        Image*   image = new Image(L"D:\\Visual Studio 2017\\_A Мои проекты\\PicZ\\PicZ\\Castle.bmp");
 
        // Get the CLSID of the PNG encoder.
        GetEncoderClsid(L"image/png", &encoderClsid);
 
        stat = image->Save(L"D:\\Visual Studio 2017\\_A Мои проекты\\PicZ\\PicZ\\Castle.png", &encoderClsid, NULL);
 
        if (stat == Ok)
        {
            MessageBox(hWnd, L"Castle sucesfull saved!", NULL, MB_OK);
        }
        else
        {
            MessageBox(hWnd, L"Castle was not saved!", NULL, MB_OK);
        };
 
        delete image;
        GdiplusShutdown(gdiplusToken);
После отрабатывания кода, выдает сообщение:
C++
1
MessageBox(hWnd, L"Castle was not saved!", NULL, MB_OK);
Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.02.2019, 23:38
Ответы с готовыми решениями:

Конвертация bmp-файла в jpg
Все привет!!! Как с помощью WinApi файл .bmp преобразовать в файл .jpg?

Конвертировать из BMP в PNG без VCL
Приветствую, Задача: Конвертировать из BMP в PNG без VCL (но работаю на C++ Builder), без доп...

Как вывести в окно картинку jpg, png и др. (кроме .bmp) и звук, кроме WAV
Заранее спасибо за рабочий пример!

Объединение нескольких png файлов в один png-файл
В общем надо написать програмулину, которая объединяет несколько png файлов (ширина и высота...

6
2378 / 835 / 318
Регистрация: 10.02.2018
Сообщений: 1,969
07.02.2019, 15:11 2
Может где-то перемудрили при адаптации под свои нужды?
У меня код работает, файлы сохраняет.
Кликните здесь для просмотра всего текста
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <windows.h>
#include <gdiplus.h>
#include <iostream>
#pragma comment(lib, "gdiplus")
 
using namespace Gdiplus;
 
//L"D:\\Visual Studio 2017\\_A Мои проекты\\PicZ\\PicZ\\Castle";
const wchar_t* pSrcFile = L"test.bmp";
const wchar_t* pDstFile = L"test.png";
 
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);
 
int main()
{
    HWND hWnd = GetConsoleWindow();
 
    GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
 
    {
        Image image(pSrcFile);
        if (image.GetLastStatus() != Status::Ok)
            std::cout << "can't load image!" << std::endl;
 
        // Get the CLSID of the PNG encoder.
        CLSID encoderClsid;
        if (GetEncoderClsid(L"image/png", &encoderClsid) < 0)
            std::cout << "can't find encoder!" << std::endl;
 
        Status stat = image.Save(pDstFile, &encoderClsid, NULL);
        if (stat != Status::Ok)
            std::cout << "can't save image!" << std::endl;
        else
            std::cout << "OK" << std::endl;
    }
 
    GdiplusShutdown(gdiplusToken);
 
    system("pause");
    return 0;
}
 
int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // number of image encoders
    UINT  size = 0;         // size of the image encoder array in bytes
 
    ImageCodecInfo* pImageCodecInfo = NULL;
 
    GetImageEncodersSize(&num, &size);
    if (size == 0)
        return -1;  // Failure
 
    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if (pImageCodecInfo == NULL)
        return -1;  // Failure
 
    GetImageEncoders(num, size, pImageCodecInfo);
 
    for (UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;  // Success
        }
    }
 
    free(pImageCodecInfo);
    return -1;  // Failure
}
0
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 83
07.02.2019, 17:59  [ТС] 3
Под мои нужды я поменял только название файлов. Там в примере было L"Bird.bmp" и L"Bird.png", я просто подставил путь, который указан выше, больше никакой адаптации не было.

Добавлено через 54 секунды
Но на всякий случай гляну еще раз, может я действительно где-то ошибку допустил.
0
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 83
09.02.2019, 12:51  [ТС] 4
Ygg, я проверил весь код построчно, но все равно не сохраняет картинку. работает нормально, ошибок не выдает, но не сохраняет.
C++
1
2
3
4
5
Status stat = image.Save(pDstFile, &encoderClsid, NULL);
        if (stat != Status::Ok)
            std::cout << "can't save image!" << std::endl;
        else
            std::cout << "OK" << std::endl;
Вот эту проверку выше не проходит. параметр stat не равен 0. метод Save возвращает значение отличное от нуля.
Где можно найти какую нибудь информацию про этот класс, MSDN не пойдет я там и так живу...
0
2378 / 835 / 318
Регистрация: 10.02.2018
Сообщений: 1,969
09.02.2019, 16:34 5
Возможно, что нет прав на запись по указанному пути.
Image Class
Status Enumeration
Можно посмотреть GetLastError.
0
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 83
10.02.2019, 00:18  [ТС] 6
Цитата Сообщение от Ygg Посмотреть сообщение
Возможно, что нет прав на запись по указанному пути.
Нет прав у программы, или именно для этого класса?
Просто программа спокойно записывает файл по этому пути, потому что файл, который мне необходимо открыть с помощью image, создан и записан моей программой.
0
-2 / 1 / 0
Регистрация: 18.07.2018
Сообщений: 83
12.02.2019, 23:50  [ТС] 7
Проблема решилась. Оказывается я пытался работать с файлом, который полностью сохранялся на диск уже после того как программа отработает, а во время ее работы файл не "полноценный" - его размер висит как 0 кб, но после завершения работы он уже приобретает вес, в соответствии с результатом работы программы. И вот когда метод
C++
1
Image*   image = new Image(L"D:\\Visual Studio 2017\\_A Мои проекты\\PicZ\\PicZ\\Castle.bmp");
пытался отработать он брал пустой файл и создавал пустое изображение, которое естественно не могло быть сохранено.

Решением было вынести весь выше указанный код в другой проект, и запуска один, после другого. Но это решение временное, в ближайшем будущем надо все таки объединить их в один..
0
12.02.2019, 23:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2019, 23:50
Помогаю со студенческими работами здесь

Конвертация bmp в png
есть изображение созданое путём Graphics::TBitmap *Bitmap=new Graphics::TBitmap; надо...

Вращение TImage c PNG. Нужна переделка решения для BMP под PNG
Здравствуйте. Очень нужна помощь с вращением. Есть решение данной проблемы для формата bmp :...

Из bmp в png
Есть необходимость превращения изображения в формате bmp в изображение в формате png, так как...

Конвертация в png
Как клнвертировать картинку в png?


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru