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

Разбить картинку на 24 части

16.01.2015, 10:13. Показов 4398. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите. Нужно разбить картинку на 24 части.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.01.2015, 10:13
Ответы с готовыми решениями:

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

Разбить картинку на части
Здравствуйте, возник такой вопрос как разбить картинку скажем 512 на 512 на 16 равных частей?Но чтобы части были не квадратными.

Игра в мозаику. Разбить картинку на части
Вообщем нужно сделать игру в мозайку, но чтобы картинка разбивалась непересекающимися прямыми... пример картинки в приложении п.с....

16
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 10:26
Могли указать больше деталей.
Картинку необходимо выбирать или она статичная?
на 24 части разбить каким образом? на 24 квадрата, треугольника, произвольные куски разного размера?
Что подразумевается под словом разбить? просто будут грани нарисованы поверх картинки или они должны быть отдельными объектами?
0
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 14
16.01.2015, 10:30  [ТС]
мы выбираем картинку программа должна разбить ее на 24 квадрата, они должны быть отдельными объектами
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 10:34
Что то все это похоже на пятнашки с картинкой
0
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 14
16.01.2015, 10:45  [ТС]
Нет это подобие пазл
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 10:47
И наработок у Вас своих нет?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.01.2015, 12:23
Берется двадцать четыре объекта типа bitmap.
Исходная картинка нарезается на прямоугольники с шагом по сторонам в Image->size/24.
Все битмапы устанавливаются размером в Image->size/24.
Далее вот отсюда берется пункт 6.5 Копирование участков канвы.
0
 Аватар для Dinkin
783 / 556 / 136
Регистрация: 31.05.2013
Сообщений: 3,140
Записей в блоге: 3
16.01.2015, 12:25
Что есть отдельный объект? это просто на одном полотне 24 квадрата или эти квадраты еще можно перемещать или что то еще делать?
0
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 14
16.01.2015, 14:11  [ТС]
это 3*3 а надо 6*4
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
void __fastcall TForm1::Button2Click(TObject *Sender)
{
TImage * Pict = new TImage(Form1);
Pict->AutoSize = true;
 
if(OpenPictureDialog1->Execute())
{
Pict->Picture->LoadFromFile(OpenPictureDialog1->FileName);
 
 
Image1->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(0,0,Pict->Width / 3,Pict->Height / 3));
Image3->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width / 3,0,Pict->Width *2/ 3,Pict->Height / 3));
Image2->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width *2/ 3,0,Pict->Width,Pict->Height / 3));
Image10->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width *2/ 3,0,Pict->Width,Pict->Height / 3));
 
 
Image5->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(0,Pict->Height / 3,Pict->Width / 3,Pict->Height *2/ 3));
Image4->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width / 3,Pict->Height / 3,Pict->Width *2/ 3,Pict->Height *2/ 3));
Image6->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width *2/ 3,Pict->Height / 3,Pict->Width,Pict->Height *2/ 3));
 
Image9->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(0,Pict->Height *2/ 3,Pict->Width / 3,Pict->Height));
Image7->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width / 3,Pict->Height *2/ 3,Pict->Width *2/ 3,Pict->Height));
Image8->Canvas->CopyRect(Image1->ClientRect, Pict->Canvas,
                  Rect(Pict->Width *2/ 3,Pict->Height *2/ 3,Pict->Width,Pict->Height));
  }
}
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 14:18
Вы двигаетесь в правильном направлении!
Я тут примерчик почти сделал, есть кое какие трудности. Надеюсь реализую.
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 14:35
Ну может коллективным разумом получится, мои наработки (так как на работе, времени не особо)
.h
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
//---------------------------------------------------------------------------
 
#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <Dialogs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
    TButton *Button2;
    TOpenDialog *OpenDialog1;
    void __fastcall Button2Click(TObject *Sender);
private:    // User declarations
public:     // User declarations
    __fastcall TForm1(TComponent* Owner);
    void __fastcall ImageMouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y);   //Функция для передвижения
    void __fastcall ImageMouseMove(TObject *Sender, TShiftState Shift,int X, int Y);     //Функция для передвижения
    void __fastcall ImageMouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y); //Функция для передвижения
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
.cpp
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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include <vector>
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
int OldX;
int OldY;
bool IsMouseDown=false;  //Глобальные переменные
 
std::vector<TImage*> imgList;  //Вектор
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseDown(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
    OldX=X;
    OldY=Y;
    IsMouseDown=true; //Передаем координаты
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
{
 if(IsMouseDown)
        {
            imgList[0]->Left+=X-OldX;
            imgList[0]->Top+=Y-OldY;    //Перемещаем компонент пока что только 1 квадрат
            //Проблема как тут нам двигать именно тот Image над которым стоит курсор
        }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button,TShiftState Shift, int X, int Y)
{
    IsMouseDown=false;  //Закончили передвигать
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if (OpenDialog1->Execute()) {   //Выбрали файл
TImage * Pict = new TImage(Form1);
Pict->AutoSize = true;
Pict->Picture->LoadFromFile(OpenDialog1->FileName);   //Берем картинку для копирования, разбиения на части
 
int x1,x2,y;
x1=1;
x2=1;  //Не обязательно
for (int i=1; i < 5; i++) {
TImage *img=new TImage(this); //Динамический Image
 
if (i<3) {     //Так как пока делаю 4 квадрата то выстраиваем их в линию
img->OnMouseDown=ImageMouseDown;
img->OnMouseMove=ImageMouseMove;
img->OnMouseUp=ImageMouseUp;
img->Parent=Form1;
img->Height=200;
img->Width=200;
img->Left=200*x1;
img->Top=50;
imgList.push_back(img);    //Добавляем в наш вектор указатели
x1++;
}
 
else     //Эти в линию по теми чтобы картинка была целая
{
img->OnMouseDown=ImageMouseDown;
img->OnMouseMove=ImageMouseMove;
img->OnMouseUp=ImageMouseUp;
img->Parent=Form1;
img->Height=200;
img->Width=200;
img->Left=200*x2;
img->Top=250;
imgList.push_back(img);  //Добавляем в наш вектор указатели
x2++;
}
 
}
//ну для начала вот так копируем
imgList[0]->Canvas->CopyRect(imgList[0]->ClientRect, Pict->Canvas,Rect(0,0,Pict->Width / 2,Pict->Height / 2));
imgList[1]->Canvas->CopyRect(imgList[1]->ClientRect, Pict->Canvas,Rect(Pict->Width / 2,0,Pict->Width,Pict->Height / 2));
imgList[2]->Canvas->CopyRect(imgList[2]->ClientRect, Pict->Canvas,Rect(0,Pict->Height / 2,Pict->Width / 2,Pict->Height));
imgList[3]->Canvas->CopyRect(imgList[3]->ClientRect, Pict->Canvas,Rect(Pict->Width /2,Pict->Height / 2,Pict->Width,Pict->Height));
}
}
//---------------------------------------------------------------------------
Проблема в том как определить над каким динамическим Image стоит курсор чтобы передвигать именно его, пока задано грубо, двигать только 1 квадрат
Миниатюры
Разбить картинку на 24 части   Разбить картинку на 24 части  
1
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
16.01.2015, 14:52
Цитата Сообщение от demon_7 Посмотреть сообщение
как определить над каким динамическим Image стоит курсор
Ну MouseMove, не?

Я бы вообще тут воспользовался всей мощью ооп-концепции:
1) Создал бы класс "кусок", содержащий свой битмап, координаты и всю прочую хрень.
2) Реализовал бы выделение мышом заданного прямоугольника (тут можно автоматом вырезать фигурные дырки посередине каждой стороны, типа пазла настоящего). Произвольного размера или по какой-нибудь сетке, скажем, с зажатым контролом.
3) Организовал бы два режима работы программы: составление пазла и, соответственно, сбор.
4) Прекратил бы фантазировать и занялся чем-нибудь полезным. Х)

И вообще, сейчас в тему придет gunslinger и замутит какую-нибудь крутую пазлу.
0
 Аватар для demon_7
260 / 192 / 60
Регистрация: 12.05.2013
Сообщений: 857
16.01.2015, 15:04
SatanaXIII, Ну для меня это тоже первый опыт реализации таких задач, поэтому реализовывал так как понимал :3

собственно исправил (с помощью сторонних лиц правда, не относящихся к форуму)
вот исправленная функция
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,int X, int Y)
{
 if(IsMouseDown)
        {
        int listSize = imgList.size();
        for(int i = 0; i <listSize; ++i)
        {
            if(imgList[i] == Sender)
            {
            imgList[i]->Left+=X-OldX;
            imgList[i]->Top+=Y-OldY;    //Перемещаем компонент
            }
 
        }
        }
}
Миниатюры
Разбить картинку на 24 части  
2
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
16.01.2015, 15:45
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Я бы вообще тут воспользовался всей мощью ооп-концепции:
1) Создал бы класс "кусок", содержащий свой битмап, координаты и всю прочую хрень.
2) Реализовал бы выделение мышом заданного прямоугольника (тут можно автоматом вырезать фигурные дырки посередине каждой стороны, типа пазла настоящего). Произвольного размера или по какой-нибудь сетке, скажем, с зажатым контролом.
3) Организовал бы два режима работы программы: составление пазла и, соответственно, сбор.
4) Прекратил бы фантазировать и занялся чем-нибудь полезным. Х)
5) Предусмотреть возможность разрешать коллизии при накладывании одного части картинки на другую, и стыковании.
0
place status here
 Аватар для gunslinger
3185 / 2219 / 640
Регистрация: 20.07.2013
Сообщений: 5,999
17.01.2015, 04:59
Лучший ответ Сообщение было отмечено SatanaXIII как решение

Решение

Мой вариант "охватывает" лишь самое начало задачи (картинка должна иметь тип bmp и помещаться в область Image - пытался играть с коэффициентами в случае большой картинки, так как Canvas "работает" с реальным размером изображения, но мало что получилось).
Реализовал разделение картинки на блоки ("песочница"), случайное расположение не делал, для примера вывел их в том порядке, в каком они находятся в исходном изображении.
Область "итоговая картинка" разделена на сектора, куда предполагается помещать блоки.
Можно это делать либо с помощью мыши, либо используя подменю (тогда отпадет вопрос насчет коллизий).
Но по сути ничего не сделано, есть лишь набросок.
Соответственно проверка условия "решена ли задача" (собран пазл правильно или нет) отсутствует (процесс собирания пазла не реализован).
Вместо CopyRect пробовал применить BitBlt, но в итоге получил нечто невразумительное.
Так называемый "код":
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  const w = 6, h = 4, w_val = ImageSource->Width / w, h_val = ImageSource->Height / h, w_dif = (ImageSandbox->Width - ImageSource->Width) / (w-1), h_dif = (ImageSandbox->Height - ImageSource->Height) / (h-1);
  double w_koef = ImageSource->Picture->Bitmap->Width / ImageSource->Width;
  double h_koef = ImageSource->Picture->Bitmap->Height / ImageSource->Height;
  int i, j;
  for (i = 0; i <= h; i++)
  {
    ImageDest->Canvas->MoveTo(0, ImageDest->Height*i/h-0.1);
    ImageDest->Canvas->LineTo(ImageDest->Width, ImageDest->Height*i/h-0.1);
  }
 
  for (i = 0; i <= w; i++)
  {
    ImageDest->Canvas->MoveTo(ImageDest->Width*i/w-0.1, 0);
    ImageDest->Canvas->LineTo(ImageDest->Width*i/w-0.1, ImageDest->Height);
  }
 
  for (i = 0; i < w; i++)
    for (j = 0; j < h; j++)
    {
      ImageDest->Canvas->TextOutW(ImageDest->Left + i * w_val, ImageDest->Top + j * h_val, j*w+i+1);
      ImageSandbox->Canvas->CopyRect(Rect(i*(w_val+w_dif), j*(h_val+h_dif), i*(w_val+w_dif)+w_val, j*(h_val+h_dif)+h_val), ImageSource->Canvas, Rect(i*w_val*w_koef, j*h_val*h_koef, (i+1)*w_val*w_koef, (j+1)*h_val*h_koef));
//    BitBlt(ImageSandbox->Canvas->Handle, i*(w_val+w_dif), j*(h_val+h_dif), i*(w_val+w_dif)+w_val, j*(h_val+h_dif)+h_val, ImageSource->Canvas->Handle, i*w_val*w_koef, j*h_val*h_koef, SRCCOPY);
    }
Миниатюры
Разбить картинку на 24 части  
3
0 / 0 / 0
Регистрация: 16.01.2015
Сообщений: 14
17.01.2015, 19:35  [ТС]
а можно создать массив чтоб он как то так делал?
a[1][1]=Image1;
a[1][2]=Image2;
a[1][3]=Image3;
a[1][4]=Image4;
....
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
18.01.2015, 08:35
Двигаем куски рисунков
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
// Для всех Image один обработчик
void __fastcall TForm2::ImageMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift,
          int X, int Y)
{
    // Создаем TPanel на форме в количестве кусков рисунка так как TPanel имеет HWND,
    // на каждой панеле создаем TImage с Align = alClient и размером с кусок изображения.
    // Каждой паре Panel, Image присваиваем свой номер Tag
 
    // Для статически созданных TPanel
    TImage *Image =  dynamic_cast<TImage*>(Sender);
 
    TPanel* panel;
    for(int i = 0; i < ComponentCount; i++)
    {
        panel = dynamic_cast<TPanel*>(Components[i]);
        if(panel)
        {
            if(panel->Tag == Image->Tag)
            {
                ReleaseCapture();
                SendMessage(panel->Handle, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
            }
        }
    }
 
    // Для динамически созданных TPanel
    // TPanel *panel[10];
    // panel[0] = new TPanel;
    // будет такой кусок кода
    /*
    TImage *Image =  dynamic_cast<TImage*>(Sender);
    ReleaseCapture();
    SendMessage(panel[Image->Tag]->Handle, WM_SYSCOMMAND, SC_MOVE | HTCAPTION, 0);
    */
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2015, 08:35
Помогаю со студенческими работами здесь

Разбить картинку на части и распечатать каждую часть.
Помогите разбить большую картинку на кусочки и распечатать на ВЫБРАННЫЙ, а не дефолтный, принтер по сраницам.

Разбить массив на 4 части по диагонали и посчитать сумму в каждой части
Двумерный массив. Разбить массив на 4 части по диагонали и посчитать сумму в каждой части. Помогите пожалуйста

Разбить картинку на блоки
Всем привет.Прошу помощи.Подскажите алгоритм. Мне нужно загрузить картинку и разбить её на блоки (по цвету) должно работать примерно по...

Разбить на части
Здравствуйте. В р-тате подсчёта MD5 хеша строки имею 7193518E6F5F0076EF05680742323F9C...

Разбить картинку на пикселям (побитово)
Всем Здрасте! Мне нкжно разбить картинку на пиксели. Я думаю, что поскольку чёрно-белое изображение должно иметь пиксели 2 цветов...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
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
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru