Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
shadv
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 12
#1

Нужно сохранить результат в png, a не в bmp - C++

29.05.2014, 21:34. Просмотров 535. Ответов 5
Метки нет (Все метки)

Вот мой код, сохраняющий рисунок(фиолетовый квадрат) в bmp
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <string>
#include <vector>
#include <cmath>
#include <limits>
 
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <png.h>
#include <string.h>
#include <setjmp.h>
 
using namespace std;
 
struct RGBType
{
    double r,g,b;
};
 
void savebmp (const char *filename, int w,int h,int dpi, RGBType *data)
{
    FILE *f;
    int k = w*h;
    int s = 4*k;
    int filesize = 54 + s;
 
    double factor = 39.375;
    int m = static_cast<int>(factor);
 
    int ppm = dpi*m;
 
    unsigned char bmpfileheader[14] = {'B','M', 0,0,0,0,  0,0,0,0,  54,0,0,0};
    unsigned char bmpinfoheader[40] = {40,0,0,0,  0,0,0,0, 0,0,0,0,  1,0,24,0};
 
    bmpfileheader[2] = (unsigned char)(filesize);
    bmpfileheader[3] = (unsigned char)(filesize>>8);
    bmpfileheader[4] = (unsigned char)(filesize>>16);
    bmpfileheader[5] = (unsigned char)(filesize>>24);
 
    bmpinfoheader[4] = (unsigned char)(w);
    bmpinfoheader[5] = (unsigned char)(w>>8);
    bmpinfoheader[6] = (unsigned char)(w>>16);
    bmpinfoheader[7] = (unsigned char)(w>>24);
 
    bmpinfoheader[8] = (unsigned char)(h);
    bmpinfoheader[9] = (unsigned char)(h>>8);
    bmpinfoheader[10] = (unsigned char)(h>>16);
    bmpinfoheader[11] = (unsigned char)(h>>24);
 
    bmpinfoheader[21] = (unsigned char)(s);
    bmpinfoheader[22] = (unsigned char)(s>>8);
    bmpinfoheader[23] = (unsigned char)(s>>16);
    bmpinfoheader[24] = (unsigned char)(s>>24);
 
    bmpinfoheader[25] = (unsigned char)(ppm);
    bmpinfoheader[26] = (unsigned char)(ppm>>8);
    bmpinfoheader[27] = (unsigned char)(ppm>>16);
    bmpinfoheader[28] = (unsigned char)(ppm>>24);
 
    bmpinfoheader[29] = (unsigned char)(ppm);
    bmpinfoheader[30] = (unsigned char)(ppm>>8);
    bmpinfoheader[31] = (unsigned char)(ppm>>16);
    bmpinfoheader[32] = (unsigned char)(ppm>>24);
 
    f = fopen(filename,"wb");
 
    fwrite(bmpfileheader,1,14,f);
    fwrite(bmpinfoheader,1,40,f);
 
    for (int i=0; i < k; i++)
    {
        RGBType rgb = data[i];
 
        double red =(data[i].r)*255;
        double green =(data[i].g)*255;
        double blue =(data[i].b)*255;
 
        unsigned char color[3] = {(int)floor(blue),(int)floor(green),(int)floor(red)};
 
        fwrite(color,1,3,f);
    }
 
    fclose(f);
}
 
 
int thisone;
 
int main(int argc, char *argv[]) 
{
    cout<<"rendering ..."<<endl;
    
    int dpi = 72;
    int width = 640;
    int height = 480;
    int n = width*height;
 
    RGBType *pixels = new RGBType[n];
    
    for (int x=0; x < width; x++) 
    {
        for (int y=0; y < height; y++) 
        {
            thisone = y*width + x;
 
            if((x > 200 && x < 440) && (y > 200 && y < 280))
            {
            pixels[thisone].r = 23;
            pixels[thisone].g = 222;
            pixels[thisone].b = 10;
            }
            else
            {
            pixels[thisone].r = 0;
            pixels[thisone].g = 0;
            pixels[thisone].b = 0;
            }
        }
    }
    savebmp("scence.bmp",width,height,dpi,pixels);
    return 0;
}
И есть такой код, сохраняющий точку на черном фоне в png
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
75
76
77
78
#include <png.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <setjmp.h>
 
#define IMAGE_WIDTH     320
#define IMAGE_HEIGHT    240
#define IMAGE_BPP       1
 
png_structp png_ptr;
png_infop info_ptr;
 
png_bytepp rows;
 
void png_setpixel(int x,int y,int rgbcolor,png_bytepp dest)
{
    dest[y][x*3] = (rgbcolor>>16)&0xFF;
    dest[y][x*3+1] = (rgbcolor>>8)&0xFF;
    dest[y][x*3+2] = rgbcolor&0xFF;
}
 
void create_image()
{
    int i;
    rows=(png_bytepp)malloc(sizeof(png_bytep)*IMAGE_HEIGHT);
    if(rows==NULL){
        perror("malloc (rows)");
        exit(1);
    }
    for(i=0; i<IMAGE_HEIGHT; i++){
        rows[i]=(png_bytep)malloc(sizeof(png_byte)*IMAGE_WIDTH*IMAGE_BPP*3);
        if(rows[i]==NULL){
            perror("malloc (rows[i])");
            exit(1);
        }
        memset(rows[i],0x0,sizeof(png_byte)*IMAGE_WIDTH*IMAGE_BPP*3);
    }
    png_setpixel(130,80,0xFF00FF,rows);
}
 
int main()
{
    FILE *fp = fopen("out.png","wb");
    if(!fp){
        perror("fopen");
        return 1;
    }
    /* Create write structure */
    png_ptr = png_create_write_struct(
        PNG_LIBPNG_VER_STRING, NULL, NULL,NULL
    );
    if(!png_ptr){
        fprintf(stderr,"create_write_struct failed\n");
        return 1;
    }
    /* Create info structure */
    info_ptr = png_create_info_struct(png_ptr);
    if (!info_ptr){
        png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
        return 1;
    }
    /* Initialize I/O routines */
    png_init_io(png_ptr, fp);
    /* Set filters */
    png_set_filter(png_ptr, 0, PNG_FILTER_NONE);
    /* Set image information */
    png_set_IHDR(png_ptr, info_ptr, 320, 240,
        8, PNG_COLOR_TYPE_RGB, PNG_INTERLACE_NONE,
        PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
    /* Create image */
    create_image();
    png_set_rows(png_ptr,info_ptr,rows);
    /* And finally, write png file */
    png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
    fclose(fp);
    return 0;
}
Надо, что бы квадрат из первого кода сохранялся не в bmp, а в png. Я не осилил, помогите ОЧЕНЬ НАДО.

Добавлено через 1 час 43 минуты
up up
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.05.2014, 21:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нужно сохранить результат в png, a не в bmp (C++):

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

Ffmpeg сохранить AVFrame в .bmp или .jpg - C++
Контекст конвертирования создаю так: imgconvertCtx = sws_getCachedContext( imgconvertCtx, codecCtx -&gt; width, codecCtx -&gt; height, ...

Сделать скриншот экрана и сохранить в файл формата jpg или bmp - C++
Приветствую, товарищи. Необходимо сделать скриншот экрана и сохранить в файл формата jpg или bmp. У кого какие предложения? Мой...

Как сохранить полученный результат в блокноте? - C++
как сохранить полученные результаты в блокноте на рабочий стол. данные прописаны к примеру в Label1-&gt;Caption (ФИО) и Label2-&gt;Caption...

Нужно bmp перевести в jpg пoд win16 - C++
кaк мoжнo bmp перевести в jpg пoд win16

Как сохранить результат игры в памяти? Не ОЗУ - C++
Всем привет. Пишу вот морской бой и решил сделать таблицу рейтингов. И не знаю, как стоит сделать лучше. В блокноте сохранять результаты...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
29.05.2014, 21:40 #2
используя libpng++ (обертка libpng для С++)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <png++/png.hpp>
 
int main(int argc, char** argv) {
    png::image< png::rgb_pixel > image(640, 480);
 
    for (size_t y = 0; y < image.get_height(); ++y) {
        for (size_t x = 0; x < image.get_width(); ++x) {
            if((x > 200 && x < 440) && (y > 200 && y < 280))
                image[y][x] = png::rgb_pixel(23, 222, 10);
            else
                image[y][x] = png::rgb_pixel(0, 0, 0);
        }
    }
    image.write("image.png");
    return 0;
}
1
shadv
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 12
29.05.2014, 22:02  [ТС] #3
Не совсем понял как подключить #include <png++/png.hpp>
0
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
29.05.2014, 22:11 #4
Bash
1
sudo aptitude install libpng++-dev
1
shadv
0 / 0 / 0
Регистрация: 19.05.2014
Сообщений: 12
29.05.2014, 22:15  [ТС] #5
Я под виндой в VS2010
0
Max Dark
шКодер самоучка
1825 / 1627 / 592
Регистрация: 09.10.2013
Сообщений: 3,634
Записей в блоге: 6
Завершенные тесты: 2
29.05.2014, 22:30 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
распакуйте приложенный архив в папку с проектом и добавьте файлы в проект
1
Вложения
Тип файла: 7z png.tar.7z (156.2 Кб, 15 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.05.2014, 22:30
Привет! Вот еще темы с ответами:

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

Работа с файлами (умножить массив на 5, и полученный результат сохранить в файле) - C++
Дан текстовой файл в котором находиться массив из чисел. Нужно умножить этот массив на 5, и полученный результат сохранить в другом файле.

Сохранить результат работы программы в файл с возможностью вывода на экран - C++
Добрый день, есть рабочая программа поиска кратчайшего пути. Мне нужно, чтобы она еще могла сохранять результат работы в файл. И при...

Есть bmp-картинка. Нужно узнать, что за буква на ней нарисована - C++
Нужно написать простенькую систему распознавания образов. Есть 5 картинок с 5 буквами, прожка должна открывать картинку (ет сделала) и...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.05.2014, 22:30
Ответ Создать тему
Опции темы

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