Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5

Сохранение массива как jpeg

27.10.2014, 16:52. Показов 3592. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как всем известно, можно сохранять jpeg картинки с помощью классов TJPEGImage и TBitmap при помощи
C++
1
2
3
Bitmap->SaveToFile(NULL);
jpeg->Assign(Bitmap);
jpeg->SaveToFile("full_path");
В этом случае необходимо сначала вывести массив на экран, в этот самый битмап и только после этого сохранять. Но это процесс небыстрый, на моей машине занимает около 7 мс, что в некоторых случаях непростительно долго.

Вопрос заключается в следующем: можно ли массив элементов BYTE размерностью [x][y*4], сразу сохранить как .jpg, без вывода на контексты? Где х - число пикселей по вертикали, у - число пикселей по горизонтали, а 4 - число байт на каждый пиксель (красный, синий, зеленый, пустой).

На случай, если плохо объяснил задачу, пример кода (см. строку 42):
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 <vcl.h>
#include <stdlib.h>
#include <jpeg.hpp>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HBITMAP bmp=0;
HDC idc=0, tidc=0;
BYTE picture[320][240*4];
 
Graphics::TBitmap *Bitmap;
TJPEGImage *jpeg;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button2Click(TObject *Sender)
// тут мы генерируем изображение и выводим его на контекст
{
BYTE pixel;
//генерируем случайное изображение
for (int i=2; i<318; i++) {
    for (int j=2; j<238; j++) {
        pixel=random(255);
        picture[i][j*4+0]=pixel;
        picture[i][j*4+1]=pixel;
        picture[i][j*4+2]=pixel;
    }
}
Edit1->Text=IntToStr(random(255));
// показываем изображение. Но как сохранить изображение в жипег прямо в этот момент?
SetBitmapBits(bmp,320*240*4,(void*)picture);
idc=GetDC(Form1->picpan->Handle);
BitBlt(idc,0,0,240,320,tidc,0,0,SRCCOPY);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    randomize();
    idc=GetDC(Form1->picpan->Handle);
    tidc=CreateCompatibleDC(idc);
    bmp=CreateCompatibleBitmap(idc,240,320);
    SelectObject(tidc,bmp);
    ReleaseDC(Form1->picpan->Handle,idc);
 
 
    Bitmap = new Graphics::TBitmap;
    Bitmap->PixelFormat=pf24bit;
    Bitmap->Width=240;
    Bitmap->Height=320;
 
    jpeg = new TJPEGImage;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
// а тут мы сохраняем .jpg
{
Bitmap->Handle = bmp;
Bitmap->SaveToFile(NULL);
jpeg->Assign(Bitmap);
jpeg->SaveToFile("d:\\f"+Edit1->Text+".jpg");
}
//---------------------------------------------------------------------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.10.2014, 16:52
Ответы с готовыми решениями:

Сохранение Chart в .jpeg
Здравствуйте. Есть код для сохранения графика Chart в .jpeg, но он не работает: сохраняется пустой рисунок. Где ошибка? uses Jpeg; ...

Чтение и сохранение JPEG файла
Как прочитать файл формата .jpg, а потом обработанное(уже мной!) сохранить???

Сохранение рисунков JPEG, с просмотром в виде эскизов.
Доброго времени суток. Подскажите как можно реализовать следующию идею: мне необходимо вести картотеку клиентов, включая фотографии. ...

4
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
27.10.2014, 23:08
Что мешает сразу работать с пикселями Битмапа, а не создавать кучу доп. структур?
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5
28.10.2014, 12:15  [ТС]
Если вопрос про массив picture, то так сделано по той причине, что в основной моей программе генерируются такие изображения в потоке и сразу несколько, а потом выводятся на экран.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
28.10.2014, 13:58
Цитата Сообщение от super1337coder Посмотреть сообщение
в основной моей программе генерируются такие изображения в потоке и сразу несколько, а потом выводятся на экран.
Так и что это меняет?
0
0 / 0 / 0
Регистрация: 18.02.2014
Сообщений: 5
28.10.2014, 14:46  [ТС]
Сам отвечу на свой вопрос, в результате.
Надо было изначально воспользоваться функцией CreateBitmap (MSDN). В моём случае, CreateBitmap(240,320,4,8,NULL), Интерес представляет третий параметр - это количество cPanels, они же color panels, они же цветовые панели. Не очень понял, что это именно, но полагаю, что RGBA. Правда, канал альфа не используется. Но между тем, при значении 3 ничего не работало, а на 4 заработало.
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <stdlib.h>
#include <jpeg.hpp>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HBITMAP bmp=0;
HDC idc=0, tidc=0;
BYTE picture[320][240*4];
 
Graphics::TBitmap *Bitmap;
TJPEGImage *jpeg;
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
 
 
void __fastcall TForm1::Button2Click(TObject *Sender)
{
BYTE pixel;
//generate image
for (int i=2; i<318; i++) {
    for (int j=2; j<238; j++) {
        pixel=random(255);
        picture[i][j*4+0]=pixel;
        picture[i][j*4+1]=pixel;
        picture[i][j*4+2]=pixel;
    }
}
Edit1->Text=IntToStr(random(255));
// show image
SetBitmapBits(bmp,320*240*4,(void*)picture);
/*
idc=GetDC(Form1->picpan->Handle);
BitBlt(idc,0,0,240,320,tidc,0,0,SRCCOPY);
поскольку контекста нет, то и выводить некуда
*/
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    randomize();
/*  idc=GetDC(Form1->picpan->Handle);
     tidc=CreateCompatibleDC(idc);
     bmp=CreateCompatibleBitmap(idc,240,320);
     SelectObject(tidc,bmp);
     ReleaseDC(Form1->picpan->Handle,idc);
Убрали всё лишнее, теперь никакого контекста нет, программа о нём не знает.
*/
    bmp=CreateBitmap(240,320,4,8,NULL);
 
    Bitmap = new Graphics::TBitmap;
    Bitmap->PixelFormat=pf24bit;
    Bitmap->Width=240;
    Bitmap->Height=320;
 
    jpeg = new TJPEGImage;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Bitmap->Handle = bmp;
Bitmap->SaveToFile("d:\\f"+Edit1->Text+".bmp");
jpeg->Assign(Bitmap);
jpeg->SaveToFile("d:\\f"+Edit1->Text+".jpg");
}
//---------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.10.2014, 14:46
Помогаю со студенческими работами здесь

Компрессия для jpeg файла при сохранение их Timage
такая дилема...на форму в Timage добавляется jpeg файл,добавляются надписи мышкой,при сохранении картинка весит 20.2 мегабайта,оригинал...

Сохранение элемента формы в файле-картинке (.jpeg). Исключение на строке сохранения
Доброго времени суток написал код сохранения элемента формы в bitmap. Пытаюсь сохранить полученный bitmap в файл .jpeg. ...

Resize JPEG, BMP, GIF, PNG --> JPEG
Доброго дня! Стала задача сделать ресайзер. Требования: картинка по соотношению вес/качество должна примерно соответствовать...

Экспорт двухмерного массива в JPEG / BMP (график)
Уважаемые форумчане, Предисловие: есть программа, которые делает определенные итерационные расчеты и на каждой итерации выдает...

Как реализовать сохранение массива в реестре?
Здравствуйте. Мне нужно реализовать сохранение и загрузку массива array_time при запуске программы в реестре. Массив array_time является...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru