Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 20

распознать цветность

02.02.2012, 22:23. Показов 3388. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
подскажите как можно распознать какая картинка ч/б или цветная.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2012, 22:23
Ответы с готовыми решениями:

Распознать тэги
Задача следующая пользователь вводит текст наподобие html кода, необходимо что бы если пользователь ввёл "<primer>" то...

Распознать текст
Здравствуйте! Необходимо написать программу, которая будет распознавать текст со сканированного изображения. Возможно ли это сделать...

Распознать язык
Ребят помогите распознать язык на котором написан скрипт. Очень похоже на си но я не уверен вот текст скрипта: if...

28
0 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 20
03.02.2012, 23:07  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от murderer Посмотреть сообщение
Какие форматы изображений используются?
jpg и png
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
04.02.2012, 00:55
Добавил проверку для bmp,jpg и png, проверяется информация из заголовков, для изображений с палитрой, проверяется только палитра. Самый медленный случай, если градации серого в формате RGB, в таком случае будут обработаны все пикселы изображения. Можно пойти на хитрость и для худшего случая проверять только четные пикслелы или строки, скорость вырастет, но есть вероятность ошибочного определения.
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
procedure TForm1.Button1Click(Sender: TObject);
var
  scan: pByteArray;
  x,y: integer;
  gray, rgb: boolean;
  png_pal: TChunkPLTE;
  bmp_pal: array of TPaletteEntry;
begin
  if OpenPictureDialog1.Execute then begin
    gray:=false; rgb:=false;
    with TPicture.Create do begin
      LoadFromFile(OpenPictureDialog1.FileName);
      if Graphic is TJpegImage then begin
        gray:=TJpegImage(Graphic).Grayscale;
        rgb:=not gray;
      end;
      if Graphic is TPNGObject then begin
        with TPNGObject(Graphic) do begin
          gray:=Header.ColorType in [COLOR_GRAYSCALE, COLOR_GRAYSCALEALPHA];
          if not gray and (Header.ColorType=COLOR_PALETTE) then begin
            png_pal:=Chunks.ItemFromClass(TChunkPLTE) as TChunkPLTE;
            x:=0; gray:=true;
            repeat
              with png_pal.Item[x] do gray:=(rgbBlue=rgbGreen) and (rgbBlue=rgbRed);
              inc(x);
            until (x>=png_pal.Count) or not gray;
          end else rgb:=true;
        end;
      end;
      if Graphic is TBitmap then begin
        with TBitmap(Graphic) do begin
          case PixelFormat of
            pf1bit: y:=2;
            pf4bit: y:=16;
            pf8bit: y:=256;
            else y:=-1;
          end;
          if y>0 then begin
            SetLength(bmp_pal, y*SizeOf(TPaletteEntry));
            GetPaletteEntries(Palette, 0, y, bmp_pal[0]);
            x:=0; gray:=true;
            repeat
              with bmp_pal[x] do gray:=(peBlue=peGreen) and (peBlue=peRed);
              inc(x);
            until (x>=y) or not gray;
          end else rgb:=true;
        end;
      end;
      if rgb then begin
        with TBitmap.Create do begin
          Assign(Graphic);
          PixelFormat:=pf24bit;
          y:=0; gray:=true;
          repeat
            x:=0; scan:=ScanLine[y];
            repeat
              gray:=(scan[x]=scan[x+1]) and (scan[x]=scan[x+2]);
              inc(x,3);
            until (x>=Width*3) or not gray;
            inc(y);
          until (y>=Height) or not gray;
          Free;
        end;
      end;
      Free;
    end;
    if gray then ShowMessage('gray') else ShowMessage('color');
  end;
end;
1
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
04.02.2012, 08:37
Ты вызываешь LoadFromFile только для того, чтобы прочитать заголовок - это не правильно.

Добавлено через 1 час 48 минут
Вытащить информацию о цвете из jpg и png можно так
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
function IsGray(filename: PAnsiChar): boolean;
function bswap(x: dword): dword;assembler;register;
asm
  bswap eax
end;
var
  f,fm,chunksize: dword;
  map:            pointer;
begin
    f  :=CreateFileA(filename,GENERIC_READ,0,0,OPEN_EXISTING,0,0);
    fm :=CreateFileMapping(f,0,PAGE_READONLY,0,0,0);
    map:=MapViewOfFile(fm,FILE_MAP_READ,0,0,0);
    if int64(map^)=$0A1A0A0D474E5089 then //PNG
      repeat
        chunksize:=bswap(pdword(dword(map)+8)^);
        if pdword(dword(map)+12)^=$52444849 then //IHDR
        begin
          result:=pbyte(dword(map)+25)^=0;
          break;
        end;
        inc(dword(map),chunksize+12);
      until false
    else if word(map^)=$D8FF then //JPG
      repeat
        chunksize:=swap(pword(dword(map)+4)^);
        if pword(dword(map)+2)^=$DAFF then //SOS
        begin
          result:=pbyte(dword(map)+6)^=1;
          break;
        end;
        inc(dword(map),chunksize+2);
      until false;
    UnmapViewOfFile(map);
    CloseHandle(fm);
    CloseHandle(f);
end;
1
0 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 20
04.02.2012, 16:48  [ТС]
murderer, не работает
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
04.02.2012, 16:52
Выложи файл, на котором не работает. Я посмотрю.
0
0 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 20
04.02.2012, 17:21  [ТС]
вот 2 файла
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
04.02.2012, 18:16
Цитата Сообщение от murderer Посмотреть сообщение
Ты вызываешь LoadFromFile только для того, чтобы прочитать заголовок - это не правильно.
Возможно, но информация в заголовке не говорит однозначно об изображении и вполне может быть необходимо проверить значения пикселов. Если есть необходимость что-то дальше делать с изображением, то читать его придется в любом случае. Твой подход однозначно будет быстрее только для проверки заголовка и то на довольно больших файлах.
0
4195 / 1841 / 223
Регистрация: 06.10.2010
Сообщений: 4,127
04.02.2012, 19:14
akkuto
Те файлы которые ты выложил сохранены в 24 битном формате по 3 компоненты на пиксель. Их придётся сканировать целиком
0
0 / 0 / 0
Регистрация: 02.02.2012
Сообщений: 20
04.02.2012, 20:03  [ТС]
murderer, x128, спасибо вам большое за помощь
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2012, 20:03

Распознать текст
Добрый день! Вот решил написать простенький распознаватель текста с отсканированных страниц (как ABBYY FineReader). Как можно...

Распознать строку в мемо
Привет! Значит алгоритм. Загружаем в mmo1 текст => из mmo1 в mmo2 и теперь говорим wb1 что при каждом клике на bt1 он из мемо...

Распознать вид треугольника
Распознать вид треугольника, в зависимости от длины сторон. Определить и вывести на форму косинусы всех углов треугольника. При решении...

Как распознать тип переменной?
Подскажите пожалуйста, как сделать распознавание переменной К примеру, если в переменной число - сделать одно, а если строка - другое ...

Как распознать закрытие формы?
Имеется форма (не главная), на которой есть кнопка. по нажатию кнопки глобальной переменной присваивается true и форма закрывается ...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru