Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
 Аватар для Divergence
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174

Вместо информации о пикселях копируется мусор. WIC codecs, CopyPixels

27.06.2014, 00:00. Показов 1500. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Очень жаль, что мой вопрос узкоспециализированный, но я третий день не могу понять что я делаю не так...
Задача:
1) Загрузить изображение формата GIF/PNG/JPG в программу;
2) Преобразовать пиксели к формату пикселей A8R8G8B8 (32-битный цвет с поддержкой прозрачности); в итоге получить 32-разрядный bitmap внутри памяти программы.
3) В массив char скопировать все пиксели для дальнейшего анализа.

В общем проблема в том, что, чтобы я ни делал: у меня в буфере либо мусор (скорее всего кусок сжатого GIF/PNG/JPG изображения), либо просто "HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ".

Вот код, который имею на данный момент (точнее он имеет меня):
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
IWICImagingFactory      *pFactory           = NULL; //Создание фабрики
IWICBitmapDecoder       *pDecoder           = NULL; //Создание декодера
IWICBitmapFrameDecode   *pSource            = NULL; //Временный буфер хранения битмапа
IWICFormatConverter     *pConverter     = NULL; //Указатель на конвертер рисунков
//ADDITIONS/////////////////////
WICPixelFormatGUID PixelFormat;
UINT uWidth = 0;
UINT uHeight = 0;
 
//Инициализация фабрики
CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFactory)); 
//Инициализация декодера
CoCreateInstance(CLSID_WICGifDecoder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDecoder)); 
 
hr = pFactory   ->  CreateDecoderFromFilename(L"GIFs\\RECT.png", 
&GUID_ContainerFormatPng, 
GENERIC_READ, 
WICDecodeMetadataCacheOnLoad, 
&pDecoder);
hr = pDecoder       ->  GetFrame(0, &pSource);
hr = pFactory           ->  CreateFormatConverter(&pConverter);
hr = pConverter     ->  Initialize(pSource, 
GUID_WICPixelFormat32bppPBGRA, 
WICBitmapDitherTypeNone, 
NULL, 
0.f, 
WICBitmapPaletteTypeMedianCut);
//ADDITIONALS
WICRect prc;
prc.Height = 10;
prc.Width = 10;
prc.X = 0;
prc.Y = 0;
pConverter->GetPixelFormat(&PixelFormat);
pConverter->GetSize(&uWidth, &uHeight);
UINT cbBuferSize = 1000;
BYTE *bufer = new BYTE[cbBuferSize];
pConverter->CopyPixels(&prc, 12, cbBuferSize, bufer);
//////////////////END
//Загружаю битмап в Direct2D битмап
hr = hWndRT->CreateBitmapFromWicBitmap(pConverter, NULL, &BITMAPS[i][j]);
 
SafeRelease(&pFactory);
SafeRelease(&pDecoder);
SafeRelease(&pSource);
SafeRelease(&pConverter);
Я работаю с файлом изображения при помощи WIC (так рекомендуют Microsoft) затем загружаю его в Direct2D.
Проблема в том, что ни CopyPixels, ни Lock не дали мне того что мне нужно: массив char где каждый пиксель изображения будет описан как четыре байта (Alfa, Red, Green, Blue).
Подскажите пожалуйста, в чем может быть дело?
Если кто-то заинтересовался моим вопросом, я могу предоставить более подробный код (который можно будет скомпилировать и запустить для тестов)...
Очень надеюсь, хоть на какую-то помощь, так как собственные идеи кончились...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.06.2014, 00:00
Ответы с готовыми решениями:

Как создать картинку, для хранения информации в пикселях
Как создать картинку? Я хочу хранить в пикселях информацию. Видел код на дельфи p:=TBitmap.Create; ...

При внесении информации в строку таблицы, копируется в другую таблицу
Мне нужно, чтобы запрос выполнялся автоматически, нашел в интернетах только такой код. Прошу помощи INSERT INTO . ...

Появляется мусор вместо элементов
Почему программа адекватно работает только со значениями N=3, M=5? При других значениях N и M выводит мусор вместо одного/нескольких...

2
327 / 230 / 55
Регистрация: 30.05.2014
Сообщений: 682
27.06.2014, 05:37
Цитата Сообщение от Divergence Посмотреть сообщение
Я работаю с файлом изображения при помощи WIC (так рекомендуют Microsoft) затем загружаю его в Direct2D.
Кто такое "WIC" я не знаю, а через GDI+ растр можно достать так:

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
#if defined(WIN32_LEAN_AND_MEAN)
#undef WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#include <gdiplus.h>
using namespace Gdiplus;
#include <stdio.h>
 
int main()
{
   GdiplusStartupInput gdiplusStartupInput;
   ULONG_PTR           gdiplusToken;
   GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
   Bitmap* gpBitmap=new Bitmap(L"test.jpg");  
   BitmapData* bitmapData=new BitmapData;
   Rect rect(0, 0, gpBitmap->GetWidth(), gpBitmap->GetHeight());
   gpBitmap->LockBits(
      &rect,
      ImageLockModeRead,
      gpBitmap->GetPixelFormat(),
      bitmapData);
 
   printf("The stride is %d.\n\n", bitmapData->Stride);
 
   unsigned char* pixels = (unsigned char*)bitmapData->Scan0;
   FILE* out = fopen("test.raw","wb");
   fwrite(pixels,bitmapData->Stride*bitmapData->Height,1,out);
   fclose(out);
   gpBitmap->UnlockBits(bitmapData);   
   delete gpBitmap;
   delete bitmapData;
   
   GdiplusShutdown(gdiplusToken);
   return 0;
}
1
 Аватар для Divergence
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
29.06.2014, 22:56  [ТС]
Ураа!!!! Мне удалось!!!!!
Соль в том, что нужно делать IWICBitmap из конвертера, который уже расставил пиксели по местам, а я пытался делать из еще сжатого изображения!
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 "stdafx.h"
#include <Windows.h>
#include <wincodec.h>
#include <iostream>
#include <conio.h>
#include <stdio.h>
 
template <class T> void SafeRelease(T **ppT)    {   if (*ppT)       {   (*ppT)->Release();  *ppT = NULL;}   }
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    CoInitializeEx(NULL,COINIT_MULTITHREADED); //Для работы с СОМ=объектами
    
    IWICImagingFactory          *pFactory           = NULL; //Создание фабрики
    IWICBitmapDecoder           *pDecoder           = NULL; //Создание декодера
    IWICBitmapFrameDecode   *pSource            = NULL; //Временный буфер хранения битмапа
    IWICFormatConverter         *pConverter     = NULL; //Указатель на конвертер рисунков
    IWICBitmap                      *pIBitmap           = NULL; //Указатель на битмап
    IWICBitmapLock                  *pILock             = NULL; //Указатель на Lock
        
    UINT                                    uiWidth             = 10;           //Ширина картинки
    UINT                                    uiHeight            = 10;           //Высота картинки
    UINT                                    frameCount      =   0;          //Количество фреймов в gif файле
    UINT                                    cbBufferSize        =   0;          //Размер буфера для хранения пикселей
    BYTE*                               pv                      =   NULL;   //Буфер для хранения пикселей
    BYTE**                              myBufer             =   NULL;   //Мой буфер
    WICRect rcLock = { 0, 0, uiWidth, uiHeight };   //Инициализация квадрата для захвата пикселей
    WICPixelFormatGUID          pixelFormat;
        
    CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pFactory)); //Инициализация фабрики
    CoCreateInstance(CLSID_WICGifDecoder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pDecoder)); //Инициализация декодера
    
    hr = pFactory           ->  CreateDecoderFromFilename(L"GIFs\\RECT.png", &GUID_ContainerFormatPng, GENERIC_READ, WICDecodeMetadataCacheOnLoad, &pDecoder);
    hr = pFactory           ->  CreateFormatConverter(&pConverter);
 
    hr = pDecoder       ->  GetFrameCount(&frameCount);
    hr = pDecoder       ->  GetFrame(0, &pSource);
    
    pSource->GetSize(&uiWidth, &uiHeight);
    
    hr = pConverter     ->  Initialize( pSource, 
                                                    GUID_WICPixelFormat32bppPBGRA, 
                                                    WICBitmapDitherTypeNone, 
                                                    NULL, 
                                                    0.f, 
                                                    WICBitmapPaletteTypeMedianCut   );
 
    hr = pFactory->CreateBitmapFromSource(  pConverter, //pSource,          // Create a bitmap from the image frame
                                                                    WICBitmapCacheOnDemand,  // Cache metadata when needed
                                                                    &pIBitmap   );              // Pointer to the bitmap
    
    hr  =   pIBitmap->GetPixelFormat(&pixelFormat);
    hr =    pIBitmap->Lock(&rcLock, WICBitmapLockWrite, &pILock);
    
    
    
        hr = pILock->GetDataPointer(&cbBufferSize, &pv);
        std::wcout<<pixelFormat.Data4<<L"\n";
        for(int i=0; i<cbBufferSize; i+=4)
        {
            std::wcout<<L"BLUE "        <<  pv[i-1] <<L" ";
            std::wcout<<L"GREEN "   <<  pv[i]       <<L" ";
            std::wcout<<L"RED "     <<  pv[i+1] <<L" ";
            std::wcout<<L"ALFA "        <<  pv[i+2] <<L" ";
            std::wcout<<L"\n";
        }
        _getch();
        
SafeRelease(&pFactory);
SafeRelease(&pDecoder);
SafeRelease(&pSource);
SafeRelease(&pConverter);
SafeRelease(&pIBitmap);
SafeRelease(&pILock);
 
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2014, 22:56
Помогаю со студенческими работами здесь

Программа реверса строки: почему на экран выводится мусор, вместо нужного текста?
Пишу программу реверса строки (меняет местами первый символ и последний, второй и предпоследний и т.д.). На экран выводится мусор, вместо...

Вместо массива программа выводит "мусор"
#include &quot;stdafx.h&quot; #include&lt;stdio.h&gt; #include&lt;conio.h&gt; int main(void) { int i, n; float a; n = 3; for (i = 1;i...

Вместо строк "мусор" на экране
Всем привет! Не так давно начал изучать ассемблер по калашникову,пользуюсь masm,понемногу пишу мальнекие проги.Вчера столкнулся с такой...

Сортировка массива, вместо массива выводит мусор
Здравствуйте Уважаемые жители форума! Есть рабочий код сортируем массив выбором поиск наименьшего значения, но почему выводит какой то...

модуль wic-1am-v2
добрый день. у меня такой вопрос, есть cisco 2911 с версией иоса 15.0(1r)m16 и образом с2900-universalk9-mz. подойдет ли к не модемный...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru