Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46

Код из Дельфи в C++Builder

08.04.2011, 14:54. Показов 2729. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Как код из Delphi
Delphi
1
2
var
LUT: array[Byte] of Byte;
будет выглядить в C++Builder?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.04.2011, 14:54
Ответы с готовыми решениями:

код написан на дельфи, надо писать это в C++ Builder
Здравствуйте! Этот код написан на дельфи, надо писать это в C++ Builder. type TMas16x16 = array of byte; var MasSimple16...

Перевод с Дельфи на Builder
Помогите пожалуйста procedure TForm2.spdbtn1Click(Sender: TObject); var bmp : TBitmap; jpeg : TJPEGImage; begin // uses...

Перенести код из C++ Builder 5 в C++ Builder 2009
Здравствуйте! Назрела проблема, может быть поможете. СУть в следующем - сделал прогу на 5-ом Билдере, приношу преподу показывать, а там...

5
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.04.2011, 15:23
C++
1
unsigned char LUT[];
1
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
08.04.2011, 17:43  [ТС]
Спасибо.

Пытаюсь перевести процедуру, которая меняет яркость у битмапа, написанную на Дельфи:

Delphi
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
procedure ChangeBrightness(Bitmap: TBitmap; Brightness: Integer);
var
LUT: array[Byte] of Byte;
v, i: Integer;
{$IFDEF ChangeBrightness24Bit}
w, h, x, y: Integer;
LineSize: LongInt;
pLineStart: PByte;
{$ENDIF}
p: PByte;
begin
{ create LUT }
for i := 0 to 255 do
begin
   v := i + Brightness;
   if v < 0 then
     v := 0
   else if v > 255 then
     v := 255;
   LUT[i] := v;
end;
 
{$IFDEF ChangeBrightness24Bit}
{ edit bitmap }
w := Bitmap.Width;
h := Bitmap.Height - 1;
Bitmap.PixelFormat := pf24Bit;
pLineStart := PByte(Bitmap.ScanLine[h]);
{ pixel line is aligned to 32 Bit }
LineSize := ((w * 3 + 3) div 4) * 4;
w := w * 3 - 1;
for y := 0 to h do
begin
   p := pLineStart;
   for x := 0 to w do
   begin
     p^ := LUT[p^];
     Inc(p);
   end;
   Inc(pLineStart, LineSize);
end;
{$ELSE}
{ edit bitmap }
Bitmap.PixelFormat := pf32Bit;
p := PByte(Bitmap.ScanLine[Bitmap.Height - 1]);
for i := 0 to Bitmap.Width * Bitmap.Height - 1 do
 begin
   p^ := LUT[p^];
   Inc(p);
   p^ := LUT[p^];
   Inc(p);
   p^ := LUT[p^];
   Inc(p, 2);
 end;
{$ENDIF}
end;
Что-то плохо получается.

1.) В вызове функции пришлось поставить
Delphi
1
Windows::TBitmap Bitmap
, так как на
Delphi
1
TBitmap Bitmap
ругается [BCC32 Error] Unit1.cpp(8088): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'
Правильно ли это?

2.) Как перевести код
Delphi
1
p^ := LUT[p^];
на С++?

PS. RAD Studio 2010

PPS. Вот результат для CBuilder-а
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
void ChangeBrightness(Windows::TBitmap Bitmap, Integer Brightness)
{
  //    LUT: array[Byte] of Byte;
    unsigned short LUT[256];
    Integer v, i;
    #ifdef ChangeBrightness24Bit
    Integer w, h, x, y;
    LongInt LineSize;
    Windows::PByte pLineStart;
    #endif
    Windows::PByte p;
    {
    // create LUT
    for (int i=0; i<255; i++)
    {
       v=i+Brightness;
       if (v<0) {v=0;}
       else if (v>255) {v = 255;}
       LUT[i]=v;
    }
 
    #ifdef ChangeBrightness24Bit
    // edit bitmap
    w=Bitmap->Width;
    h=Bitmap->Height - 1;
    Bitmap->PixelFormat = pf24Bit;
    pLineStart = PByte(Bitmap->ScanLine[h]);
    // pixel line is aligned to 32 Bit
    LineSize = ((w * 3 + 3) div 4) * 4;
    w = w * 3 - 1;
    for (int y=0; y<h; y++)
    {
       p=pLineStart;
       for (int x=0; x<w; x++)
       {
         p^ := LUT[p^]; // не пойму как тут поменять
         Inc(p);
       }
       Inc(pLineStart, LineSize);
    }
    #else
    // edit bitmap
    Bitmap->PixelFormat=pf32Bit;
    p=Windows::PByte(Bitmap->ScanLine[Bitmap->Height - 1]);
    for (int i=0; i<Bitmap->Width*Bitmap->Height-1; i++)
    {
       p^ := LUT[p^];
       Inc(p);
       p^ := LUT[p^];
       Inc(p);
       p^ := LUT[p^];
       Inc(p, 2);
    }
    #endif
}
Добавлено через 45 минут
Оказывается надо писать не Windows::TBitmap, а Graphics::TBitmap
Остается вопрос про p^ := LUT[p^];
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
08.04.2011, 18:33
C++
1
p = LUT;
0
8 / 8 / 4
Регистрация: 08.04.2011
Сообщений: 46
14.04.2011, 17:17  [ТС]
Вот что в итоге получилось:
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
HBITMAP ChangeBrightness(Integer Brightness, String FileName)
{
    TJPEGImage *jp = new TJPEGImage();
    jp->LoadFromFile(FileName); // ПЕРЕДЕЛАТЬ
    Graphics::TBitmap *BitMap=new Graphics::TBitmap();
    BitMap->Assign(jp);
  //    LUT: array[Byte] of Byte;
    unsigned char LUT[256];
    Integer v, i;
    #ifdef ChangeBrightness24Bit
    Integer w, h, x, y;
    LongInt LineSize;
    Windows::PByte pLineStart;
    #endif
    Windows::PByte p;
    // create LUT
    for (int i=0; i<255; i++)
    {
       v=i+Brightness;
       if (v<0) {v=0;}
       else if (v>255) {v = 255;}
       LUT[i]=v;
    }
 
    #ifdef ChangeBrightness24Bit
    // edit bitmap
    w=BitMap.Width;
    h=BitMap.Height - 1;
    BitMap.PixelFormat = pf24bit;
    pLineStart=PByte(BitMap.ScanLine[h]);
    // pixel line is aligned to 32 Bit
    LineSize =((w * 3 + 3) div 4) * 4;
    w=w*3-1;
    for (int y=0; y<h; y++)
    {
       p=pLineStart;
       for (int x=0; x<w; x++)
       {
         *p=LUT[*p]; // не пойму как тут поменять
         p++;
       }
       pLineStart=pLineStart+LineSize;
    }
    #else
    // edit bitmap
    BitMap->PixelFormat=pf32bit;
    p=Windows::PByte(BitMap->ScanLine[BitMap->Height - 1]);
    for (int i=0; i<BitMap->Width*BitMap->Height-1; i++)
    {
       *p=LUT[*p];
       p++;
       *p=LUT[*p];
       p++;
       *p=LUT[*p];
       p=p+2;
    }
    #endif
    return BitMap->Handle;
//  BitMap->Free();
}
 
 
void __fastcall TForm3Foto::FormClick(TObject *Sender)
{
    HBITMAP H=ChangeBrightness(50,Form3Foto->OPD->FileName);
    Graphics::TBitmap *BM=new Graphics::TBitmap();
    BM->Handle=H;
    Form1->ImAvto->Picture->Bitmap->Assign(BM);
    Form1->ImAvto->Repaint();
}
Но вот проблема - некоторые фотографии осветляет нормально, а у некоторых неправильно изменяет цвета, например меняет белый на бирюзовый или черный.
Где ошибка?

Добавлено через 6 часов 54 минуты
Пытаюсь еще перевести процедуру изменения контраста (также найденная на просторах интернета)
Delphi
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
procedure ChangeContrast(Bitmap: TBitmap; Value: Integer; Local: Boolean);
 
function BLimit(B: Integer): Byte;
begin
    if B < 0 then
      Result := 0
    else if B > 255 then
      Result := 255
    else
      Result := B;
end;
 
var
  Dest: pRGBTriple;
  x, y, mr, mg, mb,
    W, H, tr, tg, tb: Integer;
  vd: Double;
 
begin
  if Value = 0 then
    Exit;
  W := Bitmap.Width - 1;
  H := Bitmap.Height - 1;
  if Local then
  begin
    mR := 128;
    mG := 128;
    mB := 128;
  end
  else
  begin
    tr := 0;
    tg := 0;
    tb := 0;
    for y := 0 to H do
    begin
      Dest := Bitmap.ScanLine[y];
      for x := 0 to W do
      begin
        with Dest^ do
        begin
          Inc(tb, rgbtBlue);
          Inc(tg, rgbtGreen);
          Inc(tr, rgbtRed);
        end;
        Inc(Dest);
      end;
    end;
    mB := Trunc(tb / (W * H));
    mG := Trunc(tg / (W * H));
    mR := Trunc(tr / (W * H));
  end;
  if Value > 0 then
    vd := 1 + (Value / 10)
  else
    vd := 1 - (Sqrt(-Value) / 10);
  for y := 0 to H do
  begin
    Dest := Bitmap.ScanLine[y];
    for x := 0 to W do
    begin
      with Dest^ do
      begin
        rgbtBlue := BLimit(mB + Trunc((rgbtBlue - mB) * vd));
        rgbtGreen := BLimit(mG + Trunc((rgbtGreen - mG) * vd));
        rgbtRed := BLimit(mR + Trunc((rgbtRed - mR) * vd));
      end;
      Inc(Dest);
    end;
  end;
end;
результат для C++Builder-а:
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
Byte BLimit(Integer B)
{
    if (B<0) return 0;
    else if (B>255) return 255;
    else return B;
}
 
//---------------------------------------------------------------------------
 
void ChangeContrast(Graphics::TBitmap BitMap, int Value, bool Local)
{
  PRGBTRIPLE Dest;
  int mR, mG, mB, W, H, tr, tg, tb;
  Double vd;
 
  if (Value==0) {exit;}
  W=BitMap.Width-1;
  H=BitMap.Height-1;
  if (Local)
  {
    mR=128;
    mG=128;
    mB=128;
  }
  else
  {
    tr=0;
    tg=0;
    tb=0;
    for (int y=0; y<=H; y++)
    {
      Dest=BitMap.ScanLine[y]; // тут ошибка  E2034 Cannot convert 'void *' to 'tagRGBTRIPLE *'
      for (int x=0; x<=W; x++)
      {
          tb=tb+Dest->rgbtBlue;
          tg=tg+Dest->rgbtGreen;
          tr=tr+Dest->rgbtRed;
          Dest++;
      }
    }
    mB=(int)(tb/(W*H));
    mG=(int)(tg/(W*H));
    mR=(int)(tr/(W*H));
  }
  if (Value>0) vd=1+(Value/10);
  else vd=1-(Sqrt(-Value)/10);
  for (int y=0; y<=H; y++)
  {
    Dest=Bitmap.ScanLine[y]; // тут ошибка
    for (int x=0; x<=W; x++)
    {
        Dest->rgbtBlue=BLimit(mB+(int)((Dest->rgbtBlue-mB)*vd));
        Dest->rgbtGreen=BLimit(mG+(int)((Dest->rgbtGreen-mG)*vd));
        Dest->rgbtRed=BLimit(mR+(int)((Dest->rgbtRed-mR)*vd));
        Dest++;
    }
  }
}
0
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
15.04.2011, 02:27
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
HBITMAP ChangeBrightness(Integer Brightness, String FileName)
{
  TJPEGImage *jp = new TJPEGImage();
  jp->LoadFromFile(FileName); // ПЕРЕДЕЛАТЬ
  Graphics::TBitmap *BitMap=new Graphics::TBitmap();
  BitMap->Assign(jp);
  //    LUT: array[Byte] of Byte;
  unsigned char LUT[256];
  int v, i, w, h, x, y;
  #ifdef ChangeBrightness24Bit
    long LineSize;
    ::PByte pLineStart;
  #endif
  ::PByte p;
  // create LUT
  for (int i=0; i<255; i++) {
    v=i+Brightness;
    if (v<0) {v=0;}
    else if (v>255) {v = 255;}
    LUT[i]=v;
  }
  #ifdef ChangeBrightness24Bit
    // edit bitmap
    w=BitMap.Width;
    h=BitMap.Height - 1;
    BitMap.PixelFormat = pf24bit;
    pLineStart=PByte(BitMap.ScanLine[h]);
    // pixel line is aligned to 32 Bit
    LineSize =((w * 3 + 3) div 4) * 4;
    w=w*3-1;
    for (int y=0; y<h; y++) {
       p=pLineStart;
       for (int x=0; x<w; x++)
       {
       *p=LUT[*p]; // не пойму как тут поменять
       p++;
       }
       pLineStart=pLineStart+LineSize;
    }
    #else
    // edit bitmap
    BitMap->PixelFormat=pf32bit;
    p=Windows::PByte(BitMap->ScanLine[BitMap->Height - 1]);
    for (int i=0; i<BitMap->Width*BitMap->Height-1; i++)
    {
       *p=LUT[*p]; // может, просто *p=LUT[*p]*3;
//     p++; //  может,
//     *p=LUT[*p]; //я не прав - не понимаю вашей логики
//     p++; // //  но смысла в этих строках
//     *p=LUT[*p]; я не вижу
       p=p+2;
    }
  #endif
  return BitMap->Handle;
//      BitMap->Free();
  delete BitMap;
}
 
void __fastcall TForm3Foto::FormClick(TObject *Sender)
{
  HBITMAP H=ChangeBrightness(50,Form3Foto->OPD->FileName);
  Graphics::TBitmap *BM=new Graphics::TBitmap();
  BM->Handle=H;
  Form1->ImAvto->Picture->Bitmap->Assign(BM);
  Form1->ImAvto->Repaint();
  delete BM; // 
}
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
unsigned char BLimit(int B)
{
  if (B<0) return 0;
  else if (B>255) return 255;
  else return B;
}
 
//---------------------------------------------------------------------------
void ChangeContrast(Graphics::TBitmap BitMap, int Value, bool Local)
{
  PRGBTRIPLE Dest;
  int mR, mG, mB, W, H, tr, tg, tb;
  double vd;
 
  if (Value==0) {return;}
  W=BitMap.Width-1;
  H=BitMap.Height-1;
  if (Local)
  {
        mR=128;
        mG=128;
        mB=128;
  }
  else
  {
        tr=0;
        tg=0;
        tb=0;
        for (int y=0; y<=H; y++)
        {
          Dest = BitMap->ScanLine[y]; // тут ошибка  E2034 Cannot convert 'void *' to 'tagRGBTRIPLE *'
// или    Dest = (TRGB*)BitMap->ScanLine[y]; // тут ошибка  E2034 Cannot convert 'void *' to 'tagRGBTRIPLE *'
 
          for (int x=0; x<=W; x++)
          {
                  tb=tb+Dest->rgbtBlue;
                  tg=tg+Dest->rgbtGreen;
                  tr=tr+Dest->rgbtRed;
                  Dest++;
          }
        }
        mB=(int)(tb/(W*H));
        mG=(int)(tg/(W*H));
        mR=(int)(tr/(W*H));
  }
  if (Value>0) vd=1+(Value/10);
  else vd=1-(Sqrt(-Value)/10);
  for (int y=0; y<=H; y++)
  {
        Dest = Bitmap->ScanLine[y]; // тут ошибка
// или  Dest = (TRGB*)BitMap->ScanLine[y]; // тут ошибка  E2034 Cannot convert 'void *' to 'tagRGBTRIPLE *'
        for (int x=0; x<=W; x++)
        {
                Dest->rgbtBlue=BLimit(mB+(int)((Dest->rgbtBlue-mB)*vd));
                Dest->rgbtGreen=BLimit(mG+(int)((Dest->rgbtGreen-mG)*vd));
                Dest->rgbtRed=BLimit(mR+(int)((Dest->rgbtRed-mR)*vd));
        Dest++;
        }
  }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2011, 02:27
Помогаю со студенческими работами здесь

Исходный код C++ Builder 6 в С++ Builder 5
Всем добрый вечер, ребята подскажите пожалуйста может кто сталкивался когда нужно исходник из 6 версии Builder'a описать в исходном коде 5...

Как записать в с++ вот такой код из дельфи
Привет всем! подскажите плиз, как такой код из дельфи перевести в с++ PAnsiChar(AStr)^ где AStr String; AStr=('AT+CMGF=1'...

Перенести код из VC++ в CPP Builder (код использует DLL)
Такая проблема. Есть DLL + пример её использования на Visual C++, пытаюсь этот пример перенести в Builder. Проблемы возникают в самом...

Имеется интересный небольшой код на Дельфи. Надо переписать его на С++.
Подскажите как преобразовать данный код... А вот и сам код: //объявляем структуру type spektr = record Re : double; Im :...

Почему данный код работает в builder 6 а в builder 10 не работает?
SetWindowLong(Handle, GWL_EXSTYLE, GetWindowLong(Handle, GWL_EXSTYLE) | WS_EX_LAYERED); SetLayeredWindowAttributes(Handle, 0, 128,...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru