Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Картинка->Текст->Картинка


Автор: Zzz 3.3.2005, 16:25
Вот кусочек кода:

Код

  Graphics::TBitmap *B = new Graphics::TBitmap;
  B->LoadFromFile("A.bmp");
  for (int i=0; i<B->Height; i++)
     for (int j=0; j<B->Width; j++)
    {
        Memo1->Lines->Add(B->Canvas->Pixels[i][j]);
    }
  Image1->Picture->Bitmap = B;

  Graphics::TBitmap *B1 = new Graphics::TBitmap;
  B1->Width = B->Width;
  B1->Height = B->Height;
  for (int i=0; i<B1->Height; i++)
     for (int j=0; j<B1->Width; j++)
    {
        B1->Canvas->Pixels[i][j] = (TColor)StrToInt(Memo1->Lines->Strings[i+j]);
    }
  Image2->Picture->Bitmap = B1;


Делается следующее: беру картинку, каждый пиксел записываю в Мемо, затем создаю новую и заполняю ее данными из Мемо. Картинки не похожи.
С чем это связано? Размера int не хватает или в чем то другом ошибка?

Автор: azesmcar 4.3.2005, 09:25
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 TStrings *t = new TStringList;
 Graphics::TBitmap *B = new Graphics::TBitmap;
 B->LoadFromFile("c:\\A.bmp");
 for (int i=0; i<B->Height; i++)
    for (int j=0; j<B->Width; j++)
   {
       t->Add(B->Canvas->Pixels[i][j]);
   }
 Image1->Picture->Bitmap = B;

 Graphics::TBitmap *B1 = new Graphics::TBitmap;
 B1->Width = B->Width;
 B1->Height = B->Height;
 for (int i=0; i<B1->Height; i++)
    for (int j=0; j<B1->Width; j++)
   {
       B1->Canvas->Pixels[i][j] = (TColor)StrToInt(t->Strings[i * B->Width + j]);
   }
 Image2->Picture->Bitmap = B1;
 delete t;
}


у тебя ошибка в строке
Код

B1->Canvas->Pixels[i][j] = (TColor)StrToInt(Memo1->Lines->Strings[i+j]);

Но что то мне в этом коде не нравиться...во первых лучше будет так...

Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 Graphics::TBitmap *B = new Graphics::TBitmap;
 B->LoadFromFile("c:\\A.bmp");
 TColor *pImage = new TColor[ B->Height * B->Width ];
 for (int i=0; i<B->Height; i++)
    for (int j=0; j<B->Width; j++)
   {
       pImage[i * B->Width + j] = B->Canvas->Pixels[i][j];
   }
 Image1->Picture->Bitmap = B;
 Graphics::TBitmap *B1 = new Graphics::TBitmap;
 B1->Width = B->Width;
 B1->Height = B->Height;
 for (int i=0; i<B1->Height; i++)
    for (int j=0; j<B1->Width; j++)
   {
       B1->Canvas->Pixels[i][j] = pImage[i * B->Width + j];
   }
 Image2->Picture->Bitmap = B1;
 delete B;
 delete B1;
 delete [] pImage;
}


К тому же алгоритм переобразования бинарных данных в текстовые уже существует...Base64, если тебе конечно это нужно...

Автор: Zzz 5.3.2005, 15:56
Тьфу ты блин... Так обложаться.... smile Спасибо!
Цитата

К тому же алгоритм переобразования бинарных данных в текстовые уже существует...Base64, если тебе конечно это нужно...

Интересно... а поподробнее можно

Автор: azesmcar 9.3.2005, 09:15
Можно, он хранит таблицу в которой для каждого бинарного данного каким то алгоритмом выбираеться ASCII символ...примерно так...алгоритм описан в RFC (номер не помню) также можно поискать Base64..примеров в интернете полно...

У меня есть неплохой документ на эту тему...на какой мейл высылать???

Автор: Zzz 10.3.2005, 17:15
Цитата(azesmcar @ 9.3.2005, 01:15)
У меня есть неплохой документ на эту тему...на какой мейл высылать???

Шли сюда
Заранее спасибо. Очень поможешь.

Автор: Jackal 12.3.2005, 15:53
Цитата(azesmcar @ 9.3.2005, 17:15)
У меня есть неплохой документ на эту тему...на какой мейл высылать???

И мне, если мона, а лучше выложить файло здесь на сайте. smile

Автор: azesmcar 14.3.2005, 09:08
base64.h
Код

//*********************************************************************
//* C_Base64 - a simple base64 encoder and decoder.
//*
//*     Copyright (c) 1999, Bob Withers - [email protected]
//*
//* This code may be freely used for any purpose, either personal
//* or commercial, provided the authors copyright notice remains
//* intact.
//*********************************************************************

#ifndef Base64_H
#define Base64_H

#include <string>
using std::string;  // comment if your compiler doesn't use namespaces

class Base64
{
public:
    static string encode(string data);
    static string decode(string data);
};

#endif

base64.cpp
Код

//*********************************************************************
//* Base64 - a simple base64 encoder and decoder.
//*
//*     Copyright (c) 1999, Bob Withers - [email protected]
//*
//* This code may be freely used for any purpose, either personal
//* or commercial, provided the authors copyright notice remains
//* intact.
//*********************************************************************

#include "Base64.h"

const char          fillchar = '=';

                        // 00000000001111111111222222
                        // 01234567890123456789012345
static string       cvt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

                        // 22223333333333444444444455
                        // 67890123456789012345678901
                          "abcdefghijklmnopqrstuvwxyz"

                        // 555555556666
                        // 234567890123
                          "0123456789+/";

string Base64::encode(string data)
{
    auto     string::size_type  i;
    auto     char               c;
    auto     string::size_type  len = data.length();
    auto     string             ret;

    for (i = 0; i < len; ++i)
    {
        c = (data[i] >> 2) & 0x3f;
        ret.append(1, cvt[c]);
        c = (data[i] << 4) & 0x3f;
        if (++i < len)
            c |= (data[i] >> 4) & 0x0f;

        ret.append(1, cvt[c]);
        if (i < len)
        {
            c = (data[i] << 2) & 0x3f;
            if (++i < len)
                c |= (data[i] >> 6) & 0x03;

            ret.append(1, cvt[c]);
        }
        else
        {
            ++i;
            ret.append(1, fillchar);
        }

        if (i < len)
        {
            c = data[i] & 0x3f;
            ret.append(1, cvt[c]);
        }
        else
        {
            ret.append(1, fillchar);
        }
    }

    return(ret);
}

string Base64::decode(string data)
{
    auto     string::size_type  i;
    auto     char               c;
    auto     char               c1;
    auto     string::size_type  len = data.length();
    auto     string             ret;

    for (i = 0; i < len; ++i)
    {
        c = (char) cvt.find(data[i]);
        ++i;
        c1 = (char) cvt.find(data[i]);
        c = (c << 2) | ((c1 >> 4) & 0x3);
        ret.append(1, c);
        if (++i < len)
        {
            c = data[i];
            if (fillchar == c)
                break;

            c = (char) cvt.find(c);
            c1 = ((c1 << 4) & 0xf0) | ((c >> 2) & 0xf);
            ret.append(1, c1);
        }

        if (++i < len)
        {
            c1 = data[i];
            if (fillchar == c1)
                break;

            c1 = (char) cvt.find(c1);
            c = ((c << 6) & 0xc0) | c1;
            ret.append(1, c);
        }
    }

    return(ret);
}

это работающий пример.

Остальное не знаю как выложить...единственный вариант который я нашел это ссылка, а сервера у меня нет...вышлю на мэйл...

Автор: Zzz 14.3.2005, 17:33
Все получил. Огромное спасибо. Доки почитал - оказалось все просто, осталось только попробывать.

Репутацию поднять не смогу - постов мало smile Хотя заслуживаешь smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)