FROM : Chad Leigh
DATE : Sat Aug 12 10:59:15 2006
On Aug 12, 2006, at 1:47 AM, Chad Leigh wrote:
>
> On Aug 12, 2006, at 12:01 AM, Chad Leigh wrote:
>
>>
>> On Aug 11, 2006, at 11:43 PM, Jonathan Grynspan wrote:
>>
>>> You can find more information on Cocoa's graphics model at http://
>>> developer.apple.com/documentation/Cocoa/Conceptual/
>>> CocoaDrawingGuide/index.html . Of particular interest to you may
>>> be the sections on Graphics Contexts and Images.
>>
>> I am reading that now, thanks.
>>
>> Unfortunately my new image is a cached screen representation and
>> not the hi-res PDF that it was before. And it appears from the
>> CocoaDrawingGuide docs under "Creating Graphics Contexts" that you
>> cannot create a new PDF image using the code below. It says :-
>> ( "Important: You cannot create a viable graphics context for PDF
>> or PostScript canvases using the graphicsContextWithAttributes:
>> method. You must go through the Cocoa Printing system instead."
>> That however, is what I need to do, I think.
>
> It looks like something like this works:
>
> NSImageView *imageView = [[[NSImageView alloc]
> initWithFrame:labelPDFRect] autorelease];
> [imageView setImage:newLabel];
> [imageView beginDocument];
> NSMutableData *imageData = [NSMutableData data];
> NSPrintOperation *pdfOp = [NSPrintOperation
> PDFOperationWithView:imageView insideRect:imageRect toData:imageData];
> [pdfOp runOperation];
> label = [[NSImage alloc] initWithData:imageData];
> // [pdfOp cleanUpOperation];
> [imageView endDocument];
>
>
> I get my image and it is still a PDF based image by looking at the
> single NSImageRep (NSPDFImageRep) that it contains, though I have
> not yet gotten my printing code to spit out the image as I seem to
> have screwed something up and all I get now is a gray box the size
> of the page (without margins) so the paper comes out with a gray
> box with normal white margin. This happens even when I use my PNG
> image code so I screwed something up somewhere.
Ok, I fixed my screwed up print code -- I had a blank subview that
had been added in one of my dead-end attempts at fixing this.
It appears that I am getting a PDF image from the above code.
However, it is either a screen image quality representation or when I
draw it to the printer view in my NSPrintOperation, it somehow gets
converted to a screen resolution low res.
I capture the PDF to a file when I get it from the wire and I can
print that and it is a "high resolution" image just like you would
expect the PDF to be.
I have an alternate version of my code that uses PDFPage/PDFView etc
with AffineTransforms to print to my page from just a portion of the
PDF page. So I know the original PDF is not a low res bitmap to start
Here is how I create the original NSIMage
[finalImage appendBytes:(const void *)finalImageBytes length:k];
// [finalImage writeToFile:@"express_label.pdf" atomically:YES];
newLabel = [[NSImage alloc] initWithData:finalImage];
(gdb) po newLabel
NSImage 0x1607ba30 Size={612, 792} Reps=(
NSPDFImageRep 0x1609ac40 Size={612, 792}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x792 Alpha=NO
)
(gdb)
Question on the above -- is the Pixels here a real pixels size or is
it like the page -- a coordinate system that does not really relate
to actual pixels? The way the image is drawn it appears to be a real
pixel count -- how can I get the NSImage (NSPDFImageRep) to not
degrade when I create it?
// (I now calculate some rects to grab the top half of the image and
make a new image -- this part is snipped )
// create new image
NSImageView *imageView = [[[NSImageView alloc]
initWithFrame:labelPDFRect] autorelease];
[imageView setImage:newLabel];
[imageView beginDocument];
NSMutableData *imageData = [NSMutableData data];
NSPrintOperation *pdfOp = [NSPrintOperation
PDFOperationWithView:imageView insideRect:imageRect toData:imageData];
[pdfOp runOperation];
label = [[NSImage alloc] initWithData:imageData];
// [pdfOp cleanUpOperation];
[imageView endDocument];
(gdb) po label
NSImage 0x1685f80 Size={612, 416} Reps=(
NSPDFImageRep 0x16063a30 Size={612, 416}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x416 Alpha=NO
)
(gdb)
return [label autorelease];
// gets saved away
// later in print code
// calculate a new target rect based on the paper size from the
NSPrintInfo -- not shown
// print to the print view -- show in gdb the label before it is drawn
(gdb) po label
NSImage 0x1685f80 Size={612, 416} Reps=(
NSPDFImageRep 0x16063a30 Size={612, 416}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x416 Alpha=NO
)
(gdb)
[label drawInRect:labelRect fromRect:imageRect
operation:NSCompositeCopy fraction:1.0];
// more drawing code for text etc
When this gets printed on paper the PDF is a low-res "screen" type
image and not the crisp original PDF image
What have I done wrong?
Thanks
Chad
>
> Chad
>
>
>>
>> Thanks
>> Chad
>>
>>>
>>> -Jonathan Grynspan
>>>
>>> On 12-Aug-06, at 1:34 AM, Chad Leigh wrote:
>>>
>>>>
>>>> On Aug 11, 2006, at 11:28 PM, Jonathan Grynspan wrote:
>>>>
>>>>> Try the following:
>>>>>
>>>>> NSImage *partOfImage(NSImage *input, NSRect targetRect) {
>>>>> if (input) {
>>>>> NSImage *output = [[NSImage alloc] initWithSize:
>>>>> targetRect.size];
>>>>> [output lockFocus];
>>>>> [input
>>>>> drawAtPoint: NSZeroPoint
>>>>> fromRect: targetRect
>>>>> operation: NSCompositeCopy
>>>>> fraction: 1.0f];
>>>>> [output unlockFocus];
>>>>> return [output autorelease];
>>>>> } else {
>>>>> return nil;
>>>>> }
>>>>> }
>>>>
>>>> Thanks, I will. I've been reading the lockFocus and the
>>>> drawAtPoint stuff since I posted the first request, trying to
>>>> put my brain around it. This helps immensely!
>>>>
>>>> Thanks
>>>> Chad
>>>>
>>>>>
>>>>> -Jonathan Grynspan
>>>>>
>>>>> On 12-Aug-06, at 1:17 AM, Chad Leigh wrote:
>>>>>
>>>>>> I have a Cocoa app and I get a PDF image over the internet
>>>>>> that I store in an NSImage using
>>>>>>
>>>>>> label = [[NSImage alloc] initWithData:finalImage];
>>>>>>
>>>>>>
>>>>>> The image previously was a PNG image and was exactly the image
>>>>>> needed. Now that they pass a PDF image, they pass an image
>>>>>> that is an image of a complete piece of paper with the image I
>>>>>> am interested in placed on the upper half of this virtual
>>>>>> paper (the rest is just blank). The image is always in the
>>>>>> same place and the same size so I can determine a Rect that
>>>>>> will always work to select it. I want to extract this image
>>>>>> out of the PDF and create a new NSImage (or overwrite the old
>>>>>> one, I don't care) that I can use later on to print in my own
>>>>>> existing print routine and to display thumbnails of it.
>>>>>>
>>>>>> I do not see how to go about it. Most of the draw/composite
>>>>>> routines I see in NSImage rely on an existing userspace to
>>>>>> draw into. I want to "draw" into a new NSImage. My brain is
>>>>>> having a hard time adjusting to think about how to do this.
>>>>>>
>>>>>> Ideally I want something like
>>>>>>
>>>>>> NSImage *newImage = [[NSImage alloc] initFromImage:oldImage
>>>>>> usingRect:targetRect];
>>>>>>
>>>>>> I expect what I want to do is very easy but if someone could
>>>>>> point me on the way I should be exploring I would appreciate it.
>>>>>>
>>>>>>
>>>>>> Thanks
>>>>>> Chad
>>>>>>
>>>>>> _______________________________________________
>>>>>> MacOSX-dev mailing list
>>>>>> <email_removed>
>>>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>>
>>>>> _______________________________________________
>>>>> MacOSX-dev mailing list
>>>>> <email_removed>
>>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>
>>>> _______________________________________________
>>>> MacOSX-dev mailing list
>>>> <email_removed>
>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>
>>> _______________________________________________
>>> MacOSX-dev mailing list
>>> <email_removed>
>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>
>> _______________________________________________
>> MacOSX-dev mailing list
>> <email_removed>
>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>
> _______________________________________________
> MacOSX-dev mailing list
> <email_removed>
> http://www.omnigroup.com/mailman/listinfo/macosx-dev
DATE : Sat Aug 12 10:59:15 2006
On Aug 12, 2006, at 1:47 AM, Chad Leigh wrote:
>
> On Aug 12, 2006, at 12:01 AM, Chad Leigh wrote:
>
>>
>> On Aug 11, 2006, at 11:43 PM, Jonathan Grynspan wrote:
>>
>>> You can find more information on Cocoa's graphics model at http://
>>> developer.apple.com/documentation/Cocoa/Conceptual/
>>> CocoaDrawingGuide/index.html . Of particular interest to you may
>>> be the sections on Graphics Contexts and Images.
>>
>> I am reading that now, thanks.
>>
>> Unfortunately my new image is a cached screen representation and
>> not the hi-res PDF that it was before. And it appears from the
>> CocoaDrawingGuide docs under "Creating Graphics Contexts" that you
>> cannot create a new PDF image using the code below. It says :-
>> ( "Important: You cannot create a viable graphics context for PDF
>> or PostScript canvases using the graphicsContextWithAttributes:
>> method. You must go through the Cocoa Printing system instead."
>> That however, is what I need to do, I think.
>
> It looks like something like this works:
>
> NSImageView *imageView = [[[NSImageView alloc]
> initWithFrame:labelPDFRect] autorelease];
> [imageView setImage:newLabel];
> [imageView beginDocument];
> NSMutableData *imageData = [NSMutableData data];
> NSPrintOperation *pdfOp = [NSPrintOperation
> PDFOperationWithView:imageView insideRect:imageRect toData:imageData];
> [pdfOp runOperation];
> label = [[NSImage alloc] initWithData:imageData];
> // [pdfOp cleanUpOperation];
> [imageView endDocument];
>
>
> I get my image and it is still a PDF based image by looking at the
> single NSImageRep (NSPDFImageRep) that it contains, though I have
> not yet gotten my printing code to spit out the image as I seem to
> have screwed something up and all I get now is a gray box the size
> of the page (without margins) so the paper comes out with a gray
> box with normal white margin. This happens even when I use my PNG
> image code so I screwed something up somewhere.
Ok, I fixed my screwed up print code -- I had a blank subview that
had been added in one of my dead-end attempts at fixing this.
It appears that I am getting a PDF image from the above code.
However, it is either a screen image quality representation or when I
draw it to the printer view in my NSPrintOperation, it somehow gets
converted to a screen resolution low res.
I capture the PDF to a file when I get it from the wire and I can
print that and it is a "high resolution" image just like you would
expect the PDF to be.
I have an alternate version of my code that uses PDFPage/PDFView etc
with AffineTransforms to print to my page from just a portion of the
PDF page. So I know the original PDF is not a low res bitmap to start
Here is how I create the original NSIMage
[finalImage appendBytes:(const void *)finalImageBytes length:k];
// [finalImage writeToFile:@"express_label.pdf" atomically:YES];
newLabel = [[NSImage alloc] initWithData:finalImage];
(gdb) po newLabel
NSImage 0x1607ba30 Size={612, 792} Reps=(
NSPDFImageRep 0x1609ac40 Size={612, 792}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x792 Alpha=NO
)
(gdb)
Question on the above -- is the Pixels here a real pixels size or is
it like the page -- a coordinate system that does not really relate
to actual pixels? The way the image is drawn it appears to be a real
pixel count -- how can I get the NSImage (NSPDFImageRep) to not
degrade when I create it?
// (I now calculate some rects to grab the top half of the image and
make a new image -- this part is snipped )
// create new image
NSImageView *imageView = [[[NSImageView alloc]
initWithFrame:labelPDFRect] autorelease];
[imageView setImage:newLabel];
[imageView beginDocument];
NSMutableData *imageData = [NSMutableData data];
NSPrintOperation *pdfOp = [NSPrintOperation
PDFOperationWithView:imageView insideRect:imageRect toData:imageData];
[pdfOp runOperation];
label = [[NSImage alloc] initWithData:imageData];
// [pdfOp cleanUpOperation];
[imageView endDocument];
(gdb) po label
NSImage 0x1685f80 Size={612, 416} Reps=(
NSPDFImageRep 0x16063a30 Size={612, 416}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x416 Alpha=NO
)
(gdb)
return [label autorelease];
// gets saved away
// later in print code
// calculate a new target rect based on the paper size from the
NSPrintInfo -- not shown
// print to the print view -- show in gdb the label before it is drawn
(gdb) po label
NSImage 0x1685f80 Size={612, 416} Reps=(
NSPDFImageRep 0x16063a30 Size={612, 416}
ColorSpace=NSCalibratedRGBColorSpace BPS=0 Pixels=612x416 Alpha=NO
)
(gdb)
[label drawInRect:labelRect fromRect:imageRect
operation:NSCompositeCopy fraction:1.0];
// more drawing code for text etc
When this gets printed on paper the PDF is a low-res "screen" type
image and not the crisp original PDF image
What have I done wrong?
Thanks
Chad
>
> Chad
>
>
>>
>> Thanks
>> Chad
>>
>>>
>>> -Jonathan Grynspan
>>>
>>> On 12-Aug-06, at 1:34 AM, Chad Leigh wrote:
>>>
>>>>
>>>> On Aug 11, 2006, at 11:28 PM, Jonathan Grynspan wrote:
>>>>
>>>>> Try the following:
>>>>>
>>>>> NSImage *partOfImage(NSImage *input, NSRect targetRect) {
>>>>> if (input) {
>>>>> NSImage *output = [[NSImage alloc] initWithSize:
>>>>> targetRect.size];
>>>>> [output lockFocus];
>>>>> [input
>>>>> drawAtPoint: NSZeroPoint
>>>>> fromRect: targetRect
>>>>> operation: NSCompositeCopy
>>>>> fraction: 1.0f];
>>>>> [output unlockFocus];
>>>>> return [output autorelease];
>>>>> } else {
>>>>> return nil;
>>>>> }
>>>>> }
>>>>
>>>> Thanks, I will. I've been reading the lockFocus and the
>>>> drawAtPoint stuff since I posted the first request, trying to
>>>> put my brain around it. This helps immensely!
>>>>
>>>> Thanks
>>>> Chad
>>>>
>>>>>
>>>>> -Jonathan Grynspan
>>>>>
>>>>> On 12-Aug-06, at 1:17 AM, Chad Leigh wrote:
>>>>>
>>>>>> I have a Cocoa app and I get a PDF image over the internet
>>>>>> that I store in an NSImage using
>>>>>>
>>>>>> label = [[NSImage alloc] initWithData:finalImage];
>>>>>>
>>>>>>
>>>>>> The image previously was a PNG image and was exactly the image
>>>>>> needed. Now that they pass a PDF image, they pass an image
>>>>>> that is an image of a complete piece of paper with the image I
>>>>>> am interested in placed on the upper half of this virtual
>>>>>> paper (the rest is just blank). The image is always in the
>>>>>> same place and the same size so I can determine a Rect that
>>>>>> will always work to select it. I want to extract this image
>>>>>> out of the PDF and create a new NSImage (or overwrite the old
>>>>>> one, I don't care) that I can use later on to print in my own
>>>>>> existing print routine and to display thumbnails of it.
>>>>>>
>>>>>> I do not see how to go about it. Most of the draw/composite
>>>>>> routines I see in NSImage rely on an existing userspace to
>>>>>> draw into. I want to "draw" into a new NSImage. My brain is
>>>>>> having a hard time adjusting to think about how to do this.
>>>>>>
>>>>>> Ideally I want something like
>>>>>>
>>>>>> NSImage *newImage = [[NSImage alloc] initFromImage:oldImage
>>>>>> usingRect:targetRect];
>>>>>>
>>>>>> I expect what I want to do is very easy but if someone could
>>>>>> point me on the way I should be exploring I would appreciate it.
>>>>>>
>>>>>>
>>>>>> Thanks
>>>>>> Chad
>>>>>>
>>>>>> _______________________________________________
>>>>>> MacOSX-dev mailing list
>>>>>> <email_removed>
>>>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>>
>>>>> _______________________________________________
>>>>> MacOSX-dev mailing list
>>>>> <email_removed>
>>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>>
>>>> _______________________________________________
>>>> MacOSX-dev mailing list
>>>> <email_removed>
>>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>>
>>> _______________________________________________
>>> MacOSX-dev mailing list
>>> <email_removed>
>>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>>
>> _______________________________________________
>> MacOSX-dev mailing list
>> <email_removed>
>> http://www.omnigroup.com/mailman/listinfo/macosx-dev
>
> _______________________________________________
> MacOSX-dev mailing list
> <email_removed>
> http://www.omnigroup.com/mailman/listinfo/macosx-dev






Cocoa mail archive

