자유롭게 질의 및 응답을 할 수 있는 게시판입니다. 개발자 여러분의 답변이 큰 도움이 됩니다.
- 제품설치/등록 오류 문의: 설치/등록 Q&A 이용 (제품 구매 고객 한정)
Delphi FMX에서 1bit 이미지 핸들링이 가능할까요?
2014.01.18 01:54
제가 업무의 특성상 이미지 핸들링을 참 많이 합니다.
특수 목적의 산업용 프린터를 개발하는 분야에서 일하기 때문이지요
과거 VCL에서는 이미지 핸들링에 있어서 어려운 부분이 flip/rotate등을 빠르게 처리하는 것인데요
이런 부분이 FMX에서는 Tbitmap상에 기본 함수로 있을 뿐만 아니라 속도가 기가 막히게 빠르더군요
아주 환상적인 기능이라서 매~~~~우 기뻤습니다.
그런데 기쁨도 잠시....
프린터를 구현하는데 있어서 최종적으로는 모든 이미지를 각각의 컬러 프로파일로 나누어서 1bit bitmap으로 분산하여 처리를 하는데요
FMX pixelformat에는 1비트 비트맵이 없네요...
게다가 pixelformat 자체가 readonly 속성으로 설정되어 있어서 포맷 변경이 불가능하더군요...
일단 제가 지지고 볶고 열심히 뒤져본 결과
결론은 지금은 안된다!!! 라고 생각합니다.
FMX에서는 이미지를 저장할때 모든 이미지가 다 기본 32bit bitmap으로 최종적으로 처리가 되더군요
그런데 특이점은 savetofile 함수를 안으로 안으로 계속 들어가 보면
Codec.SaveToFile(AFileName, Bitmap, SaveParams); 으로 연결되더군요
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PBitmapCodecSaveParams = ^TBitmapCodecSaveParams;
TBitmapCodecSaveParams = record
// encode quality 0..100
Quality: Integer;
end;
class function TBitmapCodecManager.SaveToFile(const AFileName: string; const Bitmap: TBitmapSurface;
const SaveParams: PBitmapCodecSaveParams = nil): Boolean;
var
Codec: TCustomBitmapCodec;
Descriptor: TBitmapCodecClassDescriptor;
begin
Result := False;
if Assigned(FBitmapCodecClassDescriptors) then
for Descriptor in FBitmapCodecClassDescriptors do
if SameText(ExtractFileExt(AFileName), Descriptor.Extension, loUserLocale) and Descriptor.CanSave then
begin
Codec := Descriptor.BitmapCodecClass.Create;
try
Result := Codec.SaveToFile(AFileName, Bitmap, SaveParams);
finally
Codec.Free;
end;
end;
end
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
그리고 SaveParams는 내부적으로 변수 자체는 존재 하는데 처리상에는 nil로 막아버리더군요
이것은 위에 있는 Quality라는 변수를 이용해서 pixelformat을 변경가능하도록 바탕을 만들어 둔것 같은데
아직 구현이 안되어 있는 느낌이랄까요?
저한테는 1bit BMP 핸들링이 절실합니다.
제가 하는 업무에 있어서 아주 핵심적인 부분이거든요
이부분이 불가능하다면 제가 하는 코딩에 FMX를 접목하는 것 자체가 불가능해지는데
그러기에는 FMX의 UI가 너무나도 매력적이네요
이런 부분 어떻게 빨리 개선이 안될까요?
댓글 2
-
Humphery
2014.01.20 19:00
-
뎅혀니
2014.01.21 18:41
아 참고는 해보겠습니다만
전체 이미지를 핸들링하고 저장하고 하는 과정을 픽셀단위로 억세스하기에는 프로세스 속도가 너무 문제가 될 듯 하네요
1비트기준 픽셀의 비트맵 정보에 접근하는 것도 문제인데요
제일 중요한것이 savetofile에서 1비트 비트맵으로 저장하는 것이 되야 하는데
방법이 없다면 VCL과 FMX를 혼용해서 써야 할 것 같네요
그런데 FMX에서는 이미지에 anti aliasing처리를 하는 것 같아서 그것만 제한할 수 있으면
일단 방법은 만들 수 있을 것 같네요
Delphi FMX에서 1bit 이미지 핸들링이 가능할까요?
2014.01.18 01:54
제가 업무의 특성상 이미지 핸들링을 참 많이 합니다.
특수 목적의 산업용 프린터를 개발하는 분야에서 일하기 때문이지요
과거 VCL에서는 이미지 핸들링에 있어서 어려운 부분이 flip/rotate등을 빠르게 처리하는 것인데요
이런 부분이 FMX에서는 Tbitmap상에 기본 함수로 있을 뿐만 아니라 속도가 기가 막히게 빠르더군요
아주 환상적인 기능이라서 매~~~~우 기뻤습니다.
그런데 기쁨도 잠시....
프린터를 구현하는데 있어서 최종적으로는 모든 이미지를 각각의 컬러 프로파일로 나누어서 1bit bitmap으로 분산하여 처리를 하는데요
FMX pixelformat에는 1비트 비트맵이 없네요...
게다가 pixelformat 자체가 readonly 속성으로 설정되어 있어서 포맷 변경이 불가능하더군요...
일단 제가 지지고 볶고 열심히 뒤져본 결과
결론은 지금은 안된다!!! 라고 생각합니다.
FMX에서는 이미지를 저장할때 모든 이미지가 다 기본 32bit bitmap으로 최종적으로 처리가 되더군요
그런데 특이점은 savetofile 함수를 안으로 안으로 계속 들어가 보면
Codec.SaveToFile(AFileName, Bitmap, SaveParams); 으로 연결되더군요
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PBitmapCodecSaveParams = ^TBitmapCodecSaveParams;
TBitmapCodecSaveParams = record
// encode quality 0..100
Quality: Integer;
end;
class function TBitmapCodecManager.SaveToFile(const AFileName: string; const Bitmap: TBitmapSurface;
const SaveParams: PBitmapCodecSaveParams = nil): Boolean;
var
Codec: TCustomBitmapCodec;
Descriptor: TBitmapCodecClassDescriptor;
begin
Result := False;
if Assigned(FBitmapCodecClassDescriptors) then
for Descriptor in FBitmapCodecClassDescriptors do
if SameText(ExtractFileExt(AFileName), Descriptor.Extension, loUserLocale) and Descriptor.CanSave then
begin
Codec := Descriptor.BitmapCodecClass.Create;
try
Result := Codec.SaveToFile(AFileName, Bitmap, SaveParams);
finally
Codec.Free;
end;
end;
end
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
그리고 SaveParams는 내부적으로 변수 자체는 존재 하는데 처리상에는 nil로 막아버리더군요
이것은 위에 있는 Quality라는 변수를 이용해서 pixelformat을 변경가능하도록 바탕을 만들어 둔것 같은데
아직 구현이 안되어 있는 느낌이랄까요?
저한테는 1bit BMP 핸들링이 절실합니다.
제가 하는 업무에 있어서 아주 핵심적인 부분이거든요
이부분이 불가능하다면 제가 하는 코딩에 FMX를 접목하는 것 자체가 불가능해지는데
그러기에는 FMX의 UI가 너무나도 매력적이네요
이런 부분 어떻게 빨리 개선이 안될까요?
댓글 2
-
Humphery
2014.01.20 19:00
-
뎅혀니
2014.01.21 18:41
아 참고는 해보겠습니다만
전체 이미지를 핸들링하고 저장하고 하는 과정을 픽셀단위로 억세스하기에는 프로세스 속도가 너무 문제가 될 듯 하네요
1비트기준 픽셀의 비트맵 정보에 접근하는 것도 문제인데요
제일 중요한것이 savetofile에서 1비트 비트맵으로 저장하는 것이 되야 하는데
방법이 없다면 VCL과 FMX를 혼용해서 써야 할 것 같네요
그런데 FMX에서는 이미지에 anti aliasing처리를 하는 것 같아서 그것만 제한할 수 있으면
일단 방법은 만들 수 있을 것 같네요
안녕하세요. 험프리.김현수입니다.
제가 이미지 프로세싱을 잘 몰라서 그러는데요.
1bit BMP 핸들링이 Fixel 정보 가져와서 컨트롤 하는 것인가요?
그 부분이라면 아래의 코드를 참고하시면 도움이 되실 것 같습니다.
만약 다른 부분이라면 VCL에서 이용하시던 샘플 코드 남기시면 관련된 정보 찾아볼 수 있을 것 같습니다.
var
Bitmap: TBitmap;
BitmapData: TBitmapData;
C: TAlphaColor;
begin
Bitmap := TBitmap.Create;
try
Bitmap.Assign(Image1.Bitmap);
Bitmap.Map(TMapAccess.maRead, BitmapData);
try
C := BitmapData.GetPixel(10, 10);
Edit1.Text := IntToHex(C, 8);
finally
Bitmap.Unmap(BitmapData);
end;
finally
Bitmap.Free;
end;