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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
#1

Переписать - C++

21.08.2010, 16:27. Просмотров 1100. Ответов 13
Метки нет (Все метки)

Есть функция(вроде на C++/CLI) из msdn, нужно её переписать на С++:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Create a new bitmap.
   Bitmap^ bmp = gcnew Bitmap( "c:\\fakePhoto.jpg" );
 
   // Lock the bitmap's bits.  
   Rectangle rect = Rectangle(0,0,bmp->Width,bmp->Height);
   System::Drawing::Imaging::BitmapData^ bmpData = bmp->LockBits( rect, System::Drawing::Imaging::ImageLockMode::ReadWrite, bmp->PixelFormat );
 
   // Get the address of the first line.
   IntPtr ptr = bmpData->Scan0;
 
   // Declare an array to hold the bytes of the bitmap.
   // This code is specific to a bitmap with 24 bits per pixels.
   int bytes = bmpData->Stride * bmp->Height;
   array<Byte>^rgbValues = gcnew array<Byte>(bytes);
 
   // Copy the RGB values into the array.
   System::Runtime::InteropServices::Marshal::Copy( ptr, rgbValues, 0, bytes );
 
   // Unlock the bits.
   bmp->UnlockBits( bmpData );
Вот, что у меня вышло:
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
WCHAR name[80];
 
    swprintf(name, L"%S", FileName.c_str()); // FileName = "HeightMap.jpg"
 
    GdiplusStartupInput input;
    ULONG_PTR token;
    GdiplusStartup(&token, &input, NULL);
 
    Bitmap*     bmp    = new Bitmap(name);
    BitmapData* bmpData = new BitmapData;
 
    Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
    bmp->LockBits(&rect,
                  ImageLockModeRead,
                  bmp->GetPixelFormat(),
                  bmpData);
 
    UINT* pixels = (UINT*)bmpData->Scan0;
 
    int bytes = bmpData->Stride * bmp->GetHeight();
    std::vector<short>rgbValues(bytes);
 
    std::copy(pixels, bytes, rgbValues);
 
    bmp->UnlockBits(bmpData);
 
    delete bmp;
    delete bmpData;
    GdiplusShutdown(token);
Код
error C2782: ::std::_Enable_if<!std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::copy(_InIt,_InIt,_OutIt): в шаблон параметр "_InIt" неоднозначен
1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2550): см. объявление 'std::copy'
1>        может быть 'int'
1>        или       'UINT *'
1>c:\projects-c++\dx9\ch13\terrain\terrain\terrain.cpp(387) : error C2782: _OutElem *std::copy(_InIt,_InIt,_OutElem (&)[_Size]): в шаблон параметр "_InIt" неоднозначен
1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2542): см. объявление 'std::copy'
1>        может быть 'int'
1>        или       'UINT *'
1>c:\projects-c++\dx9\ch13\terrain\terrain\terrain.cpp(387) : error C2782: ::std::_Enable_if<std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::copy(_InIt,_InIt,_OutIt): в шаблон параметр "_InIt" неоднозначен
1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2534): см. объявление 'std::copy'
1>        может быть 'int'
1>        или       'UINT *'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
21.08.2010, 17:37     Переписать #2
Так попробуй.. но ни че не обещаю..
C++
1
2
std::vector<UINT> rgbValues;
std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
21.08.2010, 18:04  [ТС]     Переписать #3
ISergey, спасибо, но на copy вылетает ошибка
Переписать

Вот весь код:
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
#include <windows.h>
#include <gdiplus.h>
#include <BaseTsd.h>
#include <algorithm>
#include <vector>
#include <fstream>
 
using namespace Gdiplus;
#pragma comment (lib, "gdiplus.lib")
 
int main(int argc, char* argv[])
{
    std::ofstream out;
 
    GdiplusStartupInput input;
    ULONG_PTR token;
    GdiplusStartup(&token, &input, NULL);
 
    Bitmap*     bmp    = new Gdiplus::Bitmap(TEXT("1.jpg"));
    BitmapData* bmpData = new Gdiplus::BitmapData;
 
    Rect rect(0, 0, bmp->GetWidth(), bmp->GetHeight());
    bmp->LockBits(&rect,
                  ImageLockModeRead,
                  bmp->GetPixelFormat(),
                  bmpData);
 
    UINT* pixels = (UINT*)bmpData->Scan0;
 
    int bytes = bmpData->Stride * bmp->GetHeight();
    std::vector<UINT> rgbValues;
    
    std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
 
    bmp->UnlockBits(bmpData);
 
    delete bmp;
    delete bmpData;
    GdiplusShutdown(token);
 
    out.open("test.txt");
 
    out << rgbValues[0] << " "
        << rgbValues[1] << " "
        << rgbValues[2];
 
    return 0;
}
ЗЫЖ после выполнения кода в векторе rgbValues должно біть значения составляющие цвет пикселей изображения.
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
21.08.2010, 18:30     Переписать #4
UINT поменяй на char
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
21.08.2010, 18:36  [ТС]     Переписать #5
ISergey, даже картина(
ISergey
Maniac
Эксперт С++
1347 / 880 / 52
Регистрация: 02.01.2009
Сообщений: 2,645
Записей в блоге: 1
21.08.2010, 18:39     Переписать #6
insolent, А картинку оно точно погружает?
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
21.08.2010, 18:57  [ТС]     Переписать #7
ISergey, погружает, как правильно не знаю, но разрешение картинки и формат пикселей определяет)
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
22.08.2010, 21:24  [ТС]     Переписать #8
Этот кусок переписал, так как подсказали, что copy в данном примере неправильно использовать(
C++
1
2
3
std::vector<UINT> rgbValues;
        
        std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
C++
1
2
3
std::vector<BYTE> rgbValues;
 
    memcpy(&rgbValues[0], pixels, bytes);
Но на memcpy выбивает ошибку
Переписать
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2010, 22:05     Переписать #9
Цитата Сообщение от insolent Посмотреть сообщение
memcpy(&rgbValues[0], pixels, bytes);
1. у вас пример выше написан как надо копировать, то что вам подсказали неправильно, применять memcpy для контейнеров - ужасно
2. очевидно rgbValues либо пустой, либо в нем недостаточно места, скорее первое
easybudda
Эксперт С++
9456 / 5469 / 927
Регистрация: 25.07.2009
Сообщений: 10,495
22.08.2010, 22:18     Переписать #10
insolent, на всякий случай: каждый пиксел в цветовой модели RGB должен минимум тремя байтами описываться (по байту на канал) - может в этом и засада? В смысле размер данных в приёмнике и источнике не совпадает...
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
22.08.2010, 23:27  [ТС]     Переписать #11
Я добавил после объявления вектора rgbValues
C++
1
rgbValues.resize(bytes);
копирование с
C++
1
memcpy(&rgbValues[0], pixels, bytes);
проходит без ошибок, но в векторе шлак
, а с
C++
1
std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
выбивает ошибку, как и в сообщении #3
alex_x_x
бжни
2445 / 1650 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2010, 23:44     Переписать #12
пройдитесь отладчиком и посмотрите где выбивает, а то может быть вообще тут...

Цитата Сообщение от insolent Посмотреть сообщение
out << rgbValues[0] << " "
<< rgbValues[1] << " "
<< rgbValues[2];
и вообщем пройдитесь отладчиком и посмотрите, что творится, явных ошибок не видно, все зависит от реализации используемых библиотек
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
23.08.2010, 02:24  [ТС]     Переписать #13
alex_x_x, так я хотел проверять правильность определения цветов: в файл выводится значения цветов первого пикселя.

Если копирую так:
C++
1
    std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
, то на этой строке

Если так:
C++
1
memcpy(&rgbValues[0], pixels, bytes);
, то копируется, но в векторе шлак, вот первые 20 значений:
Код
   1. [0] 153 '™' unsigned char
   2. [1] 153 '™' unsigned char
   3. [2] 153 '™' unsigned char
   4. [3] 154 'љ' unsigned char
   5. [4] 154 'љ' unsigned char
   6. [5] 154 'љ' unsigned char
   7. [6] 155 '›' unsigned char
   8. [7] 155 '›' unsigned char
   9. [8] 155 '›' unsigned char
  10. [9] 155 '›' unsigned char
  11. [10]    155 '›' unsigned char
  12. [11]    155 '›' unsigned char
  13. [12]    154 'љ' unsigned char
  14. [13]    154 'љ' unsigned char
  15. [14]    154 'љ' unsigned char
  16. [15]    150 '–' unsigned char
  17. [16]    150 '–' unsigned char
  18. [17]    150 '–' unsigned char
  19. [18]    145 '‘' unsigned char
  20. [19]    145 '‘' unsigned char
  21. [20]    145 '‘' unsigned char
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 13:08     Переписать
Еще ссылки по теме:

C++ Linux Переписать с С# на С++
C++ Переписать программу из С++ на Си
C++ Переписать программу из С++ в Си
Переписать с С# на С++ C++
C++ Переписать уравнение в с++

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

Или воспользуйтесь поиском по форуму:
insolent
826 / 347 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
24.08.2010, 13:08  [ТС]     Переписать #14
Все огромное спасибо за помощь! Извиняюсь, что так тупил. Я разобрался в коде , все работает, как мне нужно!
Yandex
Объявления
24.08.2010, 13:08     Переписать
Ответ Создать тему
Опции темы

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