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

C++

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

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

21.08.2010, 16:27. Просмотров 1115. Ответов 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 *'
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.08.2010, 16:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переписать (C++):

Переписать в С++ - C++
Помогите перевести в С++ немогу перевести. Перемножение 2-х прямоугольных матриц. Program PP_2; uses crt; type matr =...

Переписать проги с Pascal на С++ - C++
Помогите. 1# Переварачивает число. uses crt; var a: word; begin clrscr; write('Vvedite 4rehzna4noe 4islo: '); readln(a); ...

переписать std::map - C++
Добрый вечер! Есть работающая программа, в которой используется map, все работало хорошо, но теперь немного изменились условия и объем...

Возможно переписать программу? - C++
Есть программа Upgrade UA.exe хочу запустить ее на windows mobile 6. Возможно ли ее переписать.

Как переписать драйвер АЦП в защищенном режиме - C++
Помогите с переписыванием драйвера. Есть исходник драйвера АЦП который пишет в файл, необходимо переписать драйвер так что бы он писал...

Переписать код из ASM на С++ для сборки под x64 - C++
Задача: переписать код из ASM на C++ для сборки под X64 Ибо я ASM не знаю #include &quot;stdafx.h&quot; #include &quot;xrTheora_Surface_mmx.h&quot; ...

13
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
21.08.2010, 17:37 #2
Так попробуй.. но ни че не обещаю..
C++
1
2
std::vector<UINT> rgbValues;
std::copy(pixels, pixels + bytes, std::back_inserter(rgbValues));
1
insolent
826 / 344 / 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 должно біть значения составляющие цвет пикселей изображения.
0
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
21.08.2010, 18:30 #4
UINT поменяй на char
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
21.08.2010, 18:36  [ТС] #5
ISergey, даже картина(
0
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
21.08.2010, 18:39 #6
insolent, А картинку оно точно погружает?
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
21.08.2010, 18:57  [ТС] #7
ISergey, погружает, как правильно не знаю, но разрешение картинки и формат пикселей определяет)
0
insolent
826 / 344 / 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 выбивает ошибку
Переписать
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2010, 22:05 #9
Цитата Сообщение от insolent Посмотреть сообщение
memcpy(&rgbValues[0], pixels, bytes);
1. у вас пример выше написан как надо копировать, то что вам подсказали неправильно, применять memcpy для контейнеров - ужасно
2. очевидно rgbValues либо пустой, либо в нем недостаточно места, скорее первое
1
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
22.08.2010, 22:18 #10
insolent, на всякий случай: каждый пиксел в цветовой модели RGB должен минимум тремя байтами описываться (по байту на канал) - может в этом и засада? В смысле размер данных в приёмнике и источнике не совпадает...
1
insolent
826 / 344 / 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
0
alex_x_x
бжни
2449 / 1654 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.08.2010, 23:44 #12
пройдитесь отладчиком и посмотрите где выбивает, а то может быть вообще тут...

Цитата Сообщение от insolent Посмотреть сообщение
out << rgbValues[0] << " "
<< rgbValues[1] << " "
<< rgbValues[2];
и вообщем пройдитесь отладчиком и посмотрите, что творится, явных ошибок не видно, все зависит от реализации используемых библиотек
1
insolent
826 / 344 / 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
0
insolent
826 / 344 / 15
Регистрация: 30.01.2009
Сообщений: 1,204
24.08.2010, 13:08  [ТС] #14
Все огромное спасибо за помощь! Извиняюсь, что так тупил. Я разобрался в коде , все работает, как мне нужно!
0
24.08.2010, 13:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2010, 13:08
Привет! Вот еще темы с ответами:

Как переписать драйвера Windows ХР по Windows 7? - C++
Доброго времени суток. Есть код драйвера, работающего под ХР. Как мне скомпилировать этот же код на Windows 7, и что жля этого нужно?

переписать с Делфи - C++ Builder
есть небольшая программка, в которой работа со строками, помогите пожалуйста переписать её на с++ Builder. C языком я плохо знаком, и среда...

DCEF3. Переписать функцию на C++ - C++ Builder
Здравствуйте, друзья. Никак не могу переписать небольшой кусочек кода на c++. Вот кусок демо-приложения DCEF3 (guiclient.dpr). ...

Переписать с C# на Qt C++ - C++ Qt
нужно переписать класс Circle class Circle { public int x; public int y; public int radius; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

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